【问题标题】:How can I optimize this mysql query? Script Posted如何优化这个 mysql 查询?脚本已发布
【发布时间】:2017-02-01 09:05:12
【问题描述】:

所以我在下面有这段代码,用于连接服务器上的 mysql 并执行命令,它用于任何 .NET 项目的身份验证系统。现在,当我有大约 150 多个用户在线时,它会开始降低网站速度,并且 mysql 开始使用大量资源。有没有办法让这些 mysql 查询执行得更快或者不挂断?

$bn123 = $_GET['bn'];
    $hwid = $_GET['hwid'];
    $ip = getRealIpAddr();
    $pcname = $_GET['pcname'];
    $country123 = "N/A";
    $time123 = time();

    $GetRows = $odb->query("SELECT * FROM `Account` WHERE bn = '$bn123'");
    $row_count = $GetRows->rowCount();
    $count = $row_count;
    if($count == 0){
        $odb->exec("INSERT INTO `logs` (id, bn, cpukey, ip, pcname, time, log) VALUES(NULL,'$bn123','$hwid','$ip','$pcname','$time123','SUCCESS - Bot Registered.')");
        $odb->exec("INSERT INTO `Account` (id, bn, cpukey, banned, ip, country, pcname, note, online, function, lastlogon) VALUES(NULL,'$bn123','$hwid','0','$ip','$country123','$pcname','','0','','')");
    }

    $SQLGetUsers = $odb -> query("SELECT * FROM Account WHERE `bn` = '$bn123'") or die(mysql_error()); 
    while ($getInfo = $SQLGetUsers -> fetch(PDO::FETCH_ASSOC))
    {
        $banned123 = $getInfo['banned'];
        if ($banned123 == 0) {
            $str = "Not Banned";
        } else {
            $str = "Banned";
        }
    }
    $response = $str;
    if ($response == "Not Banned")
    {
        $finaleresponse = "Success";
        $odb->exec("UPDATE Account SET `online` = '1', `lastlogon` = '$time123', `ip` = '$ip', `country` = '$country123', `pcname` = '$pcname' WHERE `bn` = '$bn123'");
    } 
    else if ($response == "Banned")
    {
        $finaleresponse = "Banned";
        $odb->exec("UPDATE Account SET `online` = '0', `lastlogon` = '$time123', `ip` = '$ip' WHERE `bn` = '$bn123'");
        $odb->exec("INSERT INTO logs (id, bn, cpukey, ip, pcname, time, log) VALUES(NULL,'$bn123','$hwid','$ip','$pcname','$time123','ERROR - User banned.')");
    }
    else
    {
        $finaleresponse = "Error";
        $odb->exec("UPDATE Account SET `online` = '0', `lastlogon` = '$time123', `ip` = '$ip' WHERE `username` = '$username1'");
        $odb->exec("INSERT INTO logs (id, username, cpukey, ip, pcname, time, log) VALUES(NULL,'$username1','$hwid','$ip','$pcname','$time123','ERROR - Something went wrong.')");
    }
    echo Encrypt($finaleresponse);

请告诉我任何优化此代码的方法,因为我认为它已经优化,谢谢!这里还有 db.php:

<?php
define('DB_HOST', 'localhost');
define('DB_NAME', '');
define('DB_USERNAME', '');
define('DB_PASSWORD', '');

$odb = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME, DB_USERNAME, DB_PASSWORD);
?>

【问题讨论】:

  • @JayBlanchard 你建议我做什么?
  • 首先,使用准备好的语句/参数化查询。其次,使用 EXPLAIN 查询来确保您的查询正确使用表索引 - 如果有索引。如果没有,您需要索引表以提高速度。
  • 结合@JayBlanchard 的建议,试着找出是哪个查询拖慢了你的代码。之后使用 EXPLAIN,如果仍有疑问,请使用更具体的问题更新您的帖子。

标签: php mysql optimization pdo query-optimization


【解决方案1】:

INSERTs“不能”很慢。所以一定是5个SELECTsUPDATEs。 5 不是一个大数字,所以肯定有缺失的索引。

所有 5 个都需要在 Account 上的 bn 上的索引? (请为涉及的每张桌子提供SHOW CREATE TABLE,所以我不会提出已经完成的建议。)

另外,...不要从Account 获取相同的行两次。

【讨论】:

    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多