【发布时间】:2014-07-09 07:48:27
【问题描述】:
我在调试慢查询时遇到了麻烦,当我认为它们的执行速度相对较快时,让我为您分解一下:
第一个查询,即我的子查询,将所有行按lmu_id 分组(目前只有 2 个唯一行)并返回max(id),也就是最后插入的行。
SELECT max(id) FROM `position` GROUP by lmu_id
-> 15055,15091
共 2 个,查询耗时 0.0030 秒
外部查询检索这两个位置的整行,所以这里我手动插入了 id (15055,15091)
SELECT * FROM `position` WHERE id IN (15055,15091)
共 2 个,查询耗时 0.1169 秒
不是最快的查询,但仍然是一目了然。
现在我的问题是我不明白为什么如果我将这两个查询结合起来整个系统会崩溃:
SELECT * FROM `position` AS p1 WHERE p1.id IN (SELECT max(id) FROM `position` AS p2 GROUP by p2.lmu_id)
耗时,100% cpu,崩溃,2 分钟后失去耐心,服务 mysql 重启
为了您的参考,我对查询进行了解释
EXPLAIN SELECT * FROM `position` AS p1 WHERE p1.id IN (SELECT max(p2.id) FROM `position` AS p2 GROUP by p2.lmu_id)
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY p1 ALL NULL NULL NULL NULL 7613 Using where
2 DEPENDENT SUBQUERY p2 index NULL position_lmu_id_index 5 NULL 1268 Using index
id 是主键,lmu_id 是外键,也是索引。
我真的很难过。为什么最终查询需要这么长时间/崩溃?我还应该查看哪些其他事项?
【问题讨论】: