我在调试慢速查询时遇到问题,当我把它设置为appart时,它们表现得相对较快,让我为你分解:
第一个查询,即我的子查询,按lmu_id
(目前只有2个唯一的行)对所有行进行分组,并返回max(id)
,换言之,最后插入的行。
SELECT max(id) FROM `position` GROUP by lmu_id
-> 15055,15091
总共2次,查询耗时0.0030秒
外部查询检索这两个位置的完整行,所以我在这里手动插入了ids (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
是外键并且也已编入索引。
我真的很难过。为什么最终查询花了这么长时间/崩溃?我还会看到其他什么东西?
答案 0 :(得分:2)
加入也可以。
SELECT *
FROM `position` AS p1
INNER JOIN (SELECT max(id) FROM `position` GROUP by lmu_id) p2 on (p1.id = p2.id)
斯科特的答案也很好,因为我发现EXISTS
往往也会跑得很快。通常,请避免使用IN
。
也可以尝试
SELECT *
FROM `position` AS p1
GROUP BY p1.lmu_id
HAVING p1.id = (SELECT max(id) FROM `position` where lmu_id = p1.lmu_id)
答案 1 :(得分:1)