为什么MySQL JOIN明显快于WHERE IN(子查询)

我试图更好地理解为什么这个查询优化是如此重要(超过100倍),所以我可以重用其他查询类似的逻辑.

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

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

> http://img195.imageshack.us/img195/9494/mysqlfaster.png

查询: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

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

相关文章

昨天的考试过程中,有个考点的服务器蓝屏重启后发现Mysql启动不了(5.6.45 x32版本,使用innoDB),重装后...
整数类型 标准 SQL 中支持 INTEGER 和 SMALLINT 这两种类型,MySQL 数据库除了支持这两种类型以外,还扩...
一条 SQL 查询语句结构如下: SELECT DISTINCT <select_list> FROM <left_table&...
数据备份 1. 备份数据库 使用 mysqldump 命令可以将数据库中的数据备份成一个文本文件,表的结构和数据...
概述 在实际工作中,在关系数据库(MySQL、PostgreSQL)的单表数据量上亿后,往往会出现查询和分析变慢...
概述 触发器是 MySQL 的数据库对象之一,不需要程序调用或手工启动,而是由事件来触发、激活,从而实现...