我试图寻找一个已经存在的答案,但发现了数千个关于长查询时间的结果。如果已经问过这个问题,很抱歉。
我有一个简单的选择查询,它在页面加载期间运行两次(其中一个总是隐藏的),我注意到第二次它永远不会超过 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>";
}
有一个车辆数据库,每辆车都存储在经销商处。该网站列出了至少有一辆活跃车辆的所有经销商。在这个循环中,还有另一个查询,用于检查实际经销商的所有车辆是否都具有"正常"状态 - 如果是这种情况,经销商已准备好进行进一步处理,因此我们在括号中放置了"就绪"备注。
该表有大约 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 秒)。
谢谢
我
敢打赌,在第一次执行语句后,它被存储在MySQL的查询缓存中,因此第二次执行只是从缓存中获取。
如果查询需要那么长时间,我敢打赌它正在执行全表扫描。 尝试解释查询以查看是否缺少关键索引。