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>标签复用代码的时候很容易出现,需要注意...