mysql join where 索引_为什么MySQL JOIN明显快于WHERE IN(子查询)

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

使用MySQL 4.1 – 在所有查询和结果时间可以一致地再现之前,重置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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值