我试图找到一个已经存在的答案,但发现了数千个关于查询时间长的结果。很抱歉,如果已经提出这个问题。
我有一个简单的选择查询,在页面加载期间运行两次(其中一个总是隐藏),我注意到第二次它永远不会超过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秒)。
谢谢
答案 0 :(得分:1)
我敢打赌,在第一次执行语句之后,它将被存储在MySQL's query cache中,以便简单地从缓存中获取第二次执行。
如果查询需要那么长时间,我敢打赌它正在执行全表扫描。尝试EXPLAIN查询以查看您是否遗漏了关键索引。