相同的MySQL查询时间在0到30秒之间变化

时间:2016-01-26 22:02:45

标签: php mysql performance

我试图找到一个已经存在的答案,但发现了数千个关于查询时间长的结果。很抱歉,如果已经提出这个问题。

我有一个简单的选择查询,在页面加载期间运行两次(其中一个总是隐藏),我注意到第二次它永远不会超过0.02秒。但即使我们只谈论几百条记录,第一次运行的确有时甚至超过30秒。当我刷新页面时,它很快就会再次减速。数据库本身不会改变。

我的问题是从哪里开始看?

网站: http://www.autonextleltar.hu/index2.php

这是我的代码:

$q=mysql_query("SELECT d_code, d_name FROM assets WHERE act = 1 GROUP BY d_code");
while ($rw=mysql_fetch_assoc($q)) {

    $d_code=$rw[d_code]; // dealer code
    $d_name=$rw[d_name]; // dealer name

    // now check if the status of all the dealer's vehicles are "ok" 

    $okq=mysql_query("SELECT status FROM assets WHERE d_code='$d_code' AND act = 1 GROUP BY status") or die(mysql_error());  
    $oknum=mysql_num_rows($okq); // if there are more than 1 rows then surely not every vehicle are "ok"
    $okrw=mysql_fetch_assoc($okq);
    $st=$okrw["status"];

    echo "<li><a href=\"#\">".substr($d_name,0,27)."</a>";
    if ($st=="ok" and $oknum==1) echo " (ready)";
    echo "</li>";
}

有一个车辆数据库,每辆车都存放在经销商处。该网站列出了至少有一辆活动车辆的所有经销商。在这个循环中,还有另一个查询,检查实际经销商的所有车辆是否都处于“正常”状态 - 如果是这种情况,经销商已做好进一步处理的准备,因此我们在括号中放置了“准备好”的备注。 / p>

该表有600条记录,如下所示:

1   id  int(11)         
2   d_code  int(11) 
3   d_name  varchar(200)    latin2_hungarian_ci
4   status  varchar(50) latin2_hungarian_ci
5   act tinyint(1)  

我认为这很简单,不会因为索引而烦恼,但很明显我错了。有时查询几秒钟但有时超过一分钟。一旦我移除“内部”查询(因此不检查车辆状态),它再次正常(<0.02秒)。

谢谢

1 个答案:

答案 0 :(得分:1)

我敢打赌,在第一次执行语句之后,它将被存储在MySQL's query cache中,以便简单地从缓存中获取第二次执行。

如果查询需要那么长时间,我敢打赌它正在执行全表扫描。尝试EXPLAIN查询以查看您是否遗漏了关键索引。