join和in和exists效率对比


 

优化sql,原sql:

select distinct q.* from aws_question q inner join aws_topic_question tq

on ( tq.topic_id=12564 or tq.topic_id=4558 or tq.topic_id=934 ) and q.question_id = tq.question_id

where q.category_id = 1 and q.status = 'CHECKED' and q.add_time <= '1496905791' and q.fenlei_id in (100,101)

order by q.add_time desc limit 0,5

 

条件: 除了两张表的主键索引,给aws_quesrion表 添加索引 add_time_fenlei_id(add_time和fenlei_id的结合)

(1) exists : 5 rows in set (0.01 sec)

select q.* from aws_question q

where exists (
select tq.question_id from aws_topic_question tq
where tq.topic_id in (12564,4558, 934) and tq.question_id=q.question_id
group by question_id
)

and q.category_id = 1 and q.status = 'CHECKED' and q.add_time <= '1496905791' and q.fenlei_id in (100,101)

order by q.add_time desc limit 0,5

=》执行结果:  5 rows in set (0.01 sec)

 

(2)in : 5 rows in set (46.91 sec)

select q.* from aws_question q

where q.question_id in (
select tq.question_id from aws_topic_question tq
where tq.topic_id in (12564,4558, 934)
group by question_id
)

and q.category_id = 1 and q.status = 'CHECKED' and q.add_time <= '1496905791' and q.fenlei_id in (100,101)

order by q.add_time desc limit 0,5

=》执行结果: 5 rows in set (46.91 sec)

 

三条sql的explain分析:

 

最后结论: exists效率最高,望高手指教!!!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM