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