gpt4 book ai didi

mysql - 为什么 MySQL JOIN 比 WHERE IN(子查询)快得多

转载 作者:可可西里 更新时间:2023-11-01 07:06:47 26 4
gpt4 key购买 nike

我试图更好地理解为什么这种查询优化如此重要(快 100 多倍),以便我可以为其他查询重用类似的逻辑。

使用 MySQL 4.1 - RESET QUERY CACHE 和 FLUSH TABLES 在所有查询和结果时间可以一致地重现之前完成。在 EXPLAIN 上对我来说唯一显而易见的是在 JOIN 期间只需要找到 5 行?但这就是速度的全部答案吗?这两个查询都使用部分索引 (forum_stickies) 来确定已删除的主题状态 (topic_status=0)

使用 EXPLAIN 进行更深入分析的屏幕截图

慢查询:0.7+ 秒(清除缓存)

SELECT SQL_NO_CACHE forum_id, topic_id FROM bb_topics 
WHERE topic_last_post_id IN
(SELECT SQL_NO_CACHE MAX (topic_last_post_id) AS topic_last_post_id
FROM bb_topics WHERE topic_status=0 GROUP BY forum_id)

快速查询:0.004 秒或更短(清除缓存)

SELECT SQL_NO_CACHE forum_id, topic_id FROM bb_topics AS s1 
JOIN
(SELECT SQL_NO_CACHE MAX(topic_last_post_id) AS topic_last_post_id
FROM bb_topics WHERE topic_status=0 GROUP BY forum_id) AS s2
ON s1.topic_last_post_id=s2.topic_last_post_id

请注意,最重要的列 (topic_last_post_id) 上没有索引,但这无济于事(无论如何都会存储结果以供重复使用)。

答案是否仅仅是因为第一次查询必须扫描 topic_last_post_id 两次,第二次才能将结果与子查询匹配?如果是这样,为什么它的速度呈指数级下降?

(不太重要,我很好奇如果我确实在 topic_last_post_id 上放置索引,为什么第一个查询仍然需要这么长时间)

更新:经过多次搜索后,我在 stackoverflow 上找到了这个主题 Subqueries vs joins

最佳答案

也许引擎对 bb_topics 中的每一行执行子查询,只是为了查看它是否在结果中找到 topic_last_post_id。会很愚蠢,但也会解释巨大的差异。

关于mysql - 为什么 MySQL JOIN 比 WHERE IN(子查询)快得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1244998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com