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>標籤複用代碼的時候很容易出現,須要注意...

相關文章
相關標籤/搜索