【发布时间】:2010-11-17 17:11:38
【问题描述】:
我试图更好地理解为什么这种查询优化如此重要(快 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 TWICE,第二次将结果匹配到子查询?如果是这样,为什么它会成倍地变慢?
(不太重要,我很好奇如果我真的在topic_last_post_id 上放置索引,为什么第一个查询仍然需要这么长时间)
更新:经过多次搜索后,我在 stackoverflow 上找到了这个线程,该线程进入了这个主题Subqueries vs joins
【问题讨论】:
标签: mysql