今天來學習一下MySQL優化技巧。面試
善用 explain
查看SQL執行計劃sql
MySQL對於IN作了相應的優化,即將IN中的常量所有存儲在一個數組裏面,並且這個數組是排好序的。可是若是數值較多,產生的消耗也是比較大的。再例如:select id from table_name where num in(1,2,3)
對於連續的數值,能用 between 就不要用 in 了;再或者使用鏈接來替換。數據庫
對於null的判斷會致使引擎放棄使用索引而進行全表掃描。數組
例如LIKE 「%name」或者LIKE 「%name%」,這種查詢會致使索引失效而進行全表掃描。可是可使用LIKE 「name%」。網絡
好比select user_id,user_project from table_name where age*2=36;
性能
中對字段就好了算術運算,這會形成引擎放棄使用索引,建議改爲學習
select user_id,user_project from table_name where age=36/2;
優化
舉列來講索引含有字段id,name,school
,能夠直接用id字段,也能夠id,name這樣的順序,可是name,school都沒法使用這個索引。因此在建立聯合索引的時候必定要注意索引字段順序,經常使用的查詢字段放在最前面。spa
對於聯合索引來講,若是存在範圍查詢,好比between,>,<等條件時,會形成後面的索引字段失效。code
select id,name from table_name limit 866613, 20
使用上述sql語句作分頁的時候,可能有人會發現,隨着表數據量的增長,直接使用limit分頁查詢會愈來愈慢。
優化的方法以下:能夠取前一頁的最大行數的id,而後根據這個最大的id來限制下一頁的起點。好比此列中,上一頁最大的id是866612。sql能夠採用以下的寫法。
select id,name from table_name where id> 866612 limit 20
有的時候MySQL優化器採起它認爲合適的索引來檢索sql語句,可是可能它所採用的索引並非咱們想要的。這時就能夠採用force index來強制優化器使用咱們制定的索引。