mysql in查询优化
文章目录
最近被in子查询坑了,好惨。。。。
比如下面sql,子查询出来的category_pk并不是很大,但是生产上面执行很慢……:
select * from product p where p.category_pk in(select pk from category c where c.type=20)
1 优化法案1:把子查询改为表关联
原理:这种情况下select pk from category c where c.type=20
查询结果会作为一个临时表T,然后临时表T在和product表做关联,具体的可以使用explain查询执行计划
select * from product p
inner join (select pk from category c where c.type=20) t on p.category_pk=t.pk
2 优化法案2:使用子查询结果拼接sql,去掉子查询
select * from product p where p.category_pk in(pk1,pk2,...)
3 优化方案3:尝试使用exists代替(exists有时候未必会比in快,更推荐前两种做法,特别是第一个方案:使用表关联)
结论:写sql语句时候尽量减少子查询,可以使用explain 查出执行计划。经测试使用第一种方案表关联查询耗时会更低些
- 参考:
https://blog.csdn.net/ltaihyy/article/details/82148840
https://blog.csdn.net/why15732625998/article/details/80388236
https://zhuanlan.zhihu.com/p/90745848