【问题标题】:Trouble debugging a slow query调试慢查询时遇到问题
【发布时间】: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 是外键,也是索引。 我真的很难过。为什么最终查询需要这么长时间/崩溃?我还应该查看哪些其他事项?

【问题讨论】:

    标签: mysql indexing subquery


    【解决方案1】:

    连接也可以工作。

    SELECT *
    FROM `position` AS p1
        INNER JOIN (SELECT max(id) FROM `position` GROUP by lmu_id) p2 on (p1.id = p2.id)
    

    Scott 的回答也很好,因为我发现 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)
    

    【讨论】:

    • 太棒了,INNER JOIN 查询耗时 0.0003 秒,这要好得多
    • having 查询耗时 0.0200 秒
    【解决方案2】:

    【讨论】:

    • 他将如何在他的上下文中使用EXISTS?他正试图在来自子查询的值上“加入”另一个表。我不认为EXISTS 在这里会有所帮助。
    • 我无法弄清楚如何使用EXISTS 来达到我的预期,就像提到的 nl-x 一样
    猜你喜欢
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多