站长网 MySql教程 MySQL子查询真的很慢……解决方法?

MySQL子查询真的很慢……解决方法?

我在MySQL 5.0,5.1,5.5上测试了以下看似简单的查询,发现它非常慢. select * from entry where session_id in (select session_id from entry where created_at [some timestamp]) 多个条目可以具有相同的会话ID,但具有不同的created_at时间戳. 该查询旨在

我在MySQL 5.0,5.1,5.5上测试了以下看似简单的查询,发现它非常慢.

select * from entry where session_id in
    (select session_id from entry where created_at > [some timestamp])

多个条目可以具有相同的会话ID,但具有不同的created_at时间戳.
该查询旨在获取所有条目,这些条目具有来自同一session_id的至少一个条目,其create_at大于指定的时间戳.

我见过其他人谈到类似查询的MySQL子查询性能问题,并且MySQL认为子查询是一个依赖查询,它正在对外部查询进行全表扫描.建议的解决方法类似于:

select * from entry where session_id in
    (select session_id from
        (select session_id from entry where created_at > [some timestamp])
    as temp)

但是,这个hack对我不起作用,使它更慢.

有关如何重写此查询的任何想法?

最佳答案
根据您的数据分布,使用此选项

SELECT  e.*
FROM    (
        SELECT  session_id,MAX(created_at)
        FROM    entry
        GROUP BY
                session_id
        HAVING  MAX(created_at) > $mytimestamp
        ) ed
JOIN    entry e
ON      e.session_id = ed.session_id

(在(session_id,created_at))上创建索引,或者:

SELECT  DISTINCT e.*
FROM    entry ed
JOIN    entry e
ON      e.session_id = ed.session_id
WHERE   ed.created_at > $mytimestamp

(在created_at和session_id上创建两个单独的索引)

本文来自网络,不代表站长网立场,转载请注明出处:https://www.tzzz.com.cn/html/jc/mysql/2021/0524/5809.html

作者: dawei

【声明】:站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。
联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部