无法调试慢速查询

时间:2014-05-20 21:18:10

标签: mysql indexing subquery

我在调试慢速查询时遇到问题,当我把它设置为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是外键并且也已编入索引。 我真的很难过。为什么最终查询花了这么长时间/崩溃?我还会看到其他什么东西?

2 个答案:

答案 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)