加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

MySQL子查询真的很慢……办理要领?

发布时间:2021-05-24 02:42:51 所属栏目:编程 来源:网络整理
导读:我在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上建设两个单独的索引)

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读