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