MySQL子查询优化

原由

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

 

具体

看个很简单的例子sql

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

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

看执行计划:性能

1.查询T表全部数据用索引和A表关联,获得40W+数据.优化

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

 

优化之后:索引

同样的结果,可是这个查询只用0.007S就获得告终果.....select

看执行计划:im

1.先走索引过滤T表数据获得1行结果,而后和A表用索引左链接.

2.外层查询取内层查询的全部数据

 

例子2:

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

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

 

优化之后:

内部查询日期过滤是能够走索引的..(不过这里没有走..由于数据比较集中..条件日期稍微改下就能够走索引了)....相比以前的SQL,子查询就能够过滤掉不少数据...

 

 

小结

SQL有子查询的时候尽可能把子查询的过滤条件写到子查询里作掉.而不是到外层...MYSQL不会本身作优化.(ORACLE就会)...

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

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

相关文章
相关标签/搜索