MySQL子查询优化

起因

  以前用oracle.换了公司以后接触mysql也差不多半年了..对于子查询有一些想法,感觉稍微不注意一点..就会不走索引,让SQL变的很慢...所以记录一下特别需要注意的地方

 

具体

看个很简单的例子

1个查询,用ID去过滤数据,数据来自子查询,子查询的量大约40W+. ID上面是有索引的..

这个查询用了4.169S..结果只有16条数据而已....

看执行计划:

1.查询T表所有数据用索引和A表关联,得到40W+数据.

2.外层查询用索引去过滤这些数据得到结果

 

优化以后:

一样的结果,但是这个查询只用0.007S就得到了结果.....

看执行计划:

1.先走索引过滤T表数据得到1行结果,然后和A表用索引左连接.

2.外层查询取内层查询的所有数据

 

例子2:

这个SQL里....红框的执行计划对应的是SQL里日期条件的过滤...内部子查询查出数据以后在外部SQL里用日期过滤.

但是执行计划里看这里没有走索引...type是ALL........

 

优化以后:

内部查询日期过滤是可以走索引的..(不过这里没有走..因为数据比较集中..条件日期稍微改下就可以走索引了)....相比之前的SQL,子查询就可以过滤掉很多数据...

 

 

小结

SQL有子查询的时候尽量把子查询的过滤条件写到子查询里做掉.而不是到外层...MYSQL不会自己做优化.(ORACLE就会)...

另外嵌套查询最好不要写太多层..多写1个select * from (XXXX)可能就会对性能有一些影响....

这些问题在用mybatis写SQL...用<sql>标签复用代码的时候很容易出现,需要注意...

 

posted @ 2017-10-19 17:19  abcwt112  阅读(572)  评论(0编辑  收藏  举报