mysql常用的優化操作

lightTrace發表於2019-01-19

1. explain檢視SQL執行計劃

在查詢語句前加explain來檢視SQL執行計劃,其中五列比較重要:

  • type列,連線型別。一個好的sql語句至少要達到range級別。
  • 杜絕出現all級別key列,使用到的索引名。
  • 如果沒有選擇索引,值是NULL。可以採取強制索引方式key_len列,
  • 索引長度rows列,掃描行數。
  • 該值是個預估值extra列,詳細說明。注意常見的不太友好的值有:Using filesort, Using temporary

2.SQL語句IN的包含值不應該過多

MySQL對於IN做了相應的優化,即將IN中的常量全部儲存在一個陣列裡面,而且這個陣列是排好序的。但是如果數值較多,產生的消耗也是比較大的。例如:

select id from t where num in(1,2,3) 

對於連續的數值,能用 between 就不要用 in 了;再或者使用連線來替換。

3.SELECT語句務必指明欄位名稱

SELECT *增加很多不必要的消耗(cpu、io、記憶體、網路頻寬);增加了使用覆蓋索引的可能性;當表結構發生改變時,前斷也需要更新

4.當只需要一條資料的時候,使用limit 1

5.避免在 where 子句中對欄位進行 null 值判斷

對於null的判斷會導致引擎放棄使用索引而進行全表掃描,這條老生常談了,記得剛開始寫null判斷被同事嘲諷了,哈哈!!!而且表中數值不要出現null,用0或者其它代替,因為一個null值會導致整個欄位的索引失效

6.不建議使用%字首模糊查詢

例如LIKE “%name”或者LIKE “%name%”,這種查詢會導致索引失效而進行全表掃描。但是可以使用LIKE “name%”。
那如何查詢%name%?可以考慮全域性索引

7.對於聯合索引來說,要遵守最左字首法則

舉列來說索引含有欄位id,name,school,可以直接用id欄位,也可以id,name這樣的順序,但是name;school都無法使用這個索引。所以在建立聯合索引的時候一定要注意索引欄位順序,常用的查詢欄位放在最前面

8.儘量使用inner join,避免left join

參與聯合查詢的表至少為2張表,一般都存在大小之分。如果連線方式是inner join,在沒有其他過濾條件的情況下MySQL會自動選擇小表作為驅動表(小表驅動大表原則),但是left join在驅動表的選擇上遵循的是左邊驅動右邊的原則,即left join左邊的表名為驅動表。

9.被驅動表的索引欄位作為on的限制欄位

10.注意範圍查詢語句

對於聯合索引來說,如果存在範圍查詢,比如between,>,<等條件時,會造成後面的索引欄位失效。

11.使用合理的分頁方式以提高分頁的效率

select id,name from product limit 1000001, 10
使用上述sql語句做分頁的時候,可能有人會發現,隨著表資料量的增加,直接使用limit分頁查詢會越來越慢。優化的方法如下:可以取前一頁的最大行數的id,然後根據這個最大的id來限制下一頁的起點。比如此列中,上一頁最大的id是1000000。sql可以採用如下的寫法:select id,name from product where id> 1000000 limit 10

12.如果限制條件中其他欄位沒有索引,儘量少用or

or兩邊的欄位中,如果有一個不是索引欄位,而其他條件也不是索引欄位,會造成該查詢不走索引的情況。很多時候使用 union all (儘量使用union all代替union,union和union all的差異主要是前者需要將結果集合並後再進行唯一性過濾操作,這就會涉及到排序,增加大量的CPU運算,加大資源消耗及延遲。當然,union all的前提條件是兩個結果集沒有重複資料 )或者是union(必要的時候)的方式來代替“or”會得到更好的效果

13.如果排序欄位沒有用到索引,就儘量少排序

相關文章