1. 程式人生 > >MySQL索引實戰彙總

MySQL索引實戰彙總

MySQL索引實戰彙總

MySQL索引對資料檢索的效能至關重要,盲目的增加索引不僅不能帶來效能的提升,反而會消耗更多的額外資源,本篇總結了一些MySQL索引實戰經驗。

索引是用於快速查詢記錄的一種資料結構。索引就像是資料庫中資料的目錄,資料庫在查詢時,首先在索引中找到匹配的值,然後根據這個匹配值找到對應的資料行。

名詞解釋

聚簇索引

聚簇索引的順序就是資料的物理儲存順序,索引中資料域儲存的就是實際的資料,一個表最多隻能有一個聚簇索引,適用於查詢多行資料,不適用於頻繁修改的列,一般在主鍵上建立。

非聚簇索引

索引順序與資料物理排列順序無關,索引中儲存的內容為實際資料的地址,適應於查詢單行資料。

普通索引

即平時建立的普通索引。

唯一索引

索引所在的列或列組合的值是全表唯一的。

全文索引

MySQL從3.23.23版開始支援全文索引,它查詢的是文中的關鍵詞,而不是直接比較索引中的值。

單列索引

在單列上建立的索引。

組合索引

在多個列上建立的索引。

最左字首

where子句中有a、b、c三個查詢條件,建立一個組合索引abc(a,b,c),最左字首的概念是說以組合索引最左邊的列a組合成的查詢條件,如(a,b,c)、(a,b)、(a,c),這三種情況的查詢條件都會使用abc索引,和where子句中a、b、c出現的順序沒關係,可以是where c=? and b=? and a=?,但(b,c)組合不會使用索引,即where c=? and b=?。

適合建立索引的列

1.經常作為查詢條件的列;

2.經常作為排序條件的列;

3.經常作為join條件的列;

4.經常被查詢的列。

不適合建立索引的列

1.資料頻繁被修改的列,資料被修改,索引需要做相應的修改,消耗資源;

2.區分度不是很高的列,如性別,列值重複性太大,索引效果不是很明顯;

3.不是經常被作為查詢條件、排序條件、連線條件的列。

實戰經驗總結

1.列上進行函式計算將不會使用索引;

2.對於建立索引的列,避免儲存NULL,NULL會使索引更加複雜、效率變低,可以使用NOT NULL進行約束;

3.對於模糊查詢like '%abc%',將不會使用索引,而like 'abc%'將會使用索引;

4.對於not in、not exists、!=等負向查詢將不會使用索引;

5.每次查詢只使用一個索引,如果where條件使用了索引,order by將不再使用索引;

6.對於where子句中有多個查詢條件的,單列索引的效率不如複合索引,因為查詢每次只能使用一個索引;

7.MySQL只對以下操作符才使用索引:<、<=、=、>、>=、between、in,但是需要注意in的範圍值不要太多;

8.union all可以使用索引,但本身效率不是很高,不建議使用;

9.列上進行型別轉換的將不會使用索引;

10.老版本MySQL對OR條件不使用索引,新版本才支援,不建議使用OR。

關於索引的實戰經驗總結後續還會不斷更新。