1. 程式人生 > >【mysql】mysql索引探索(三)-- 高效能使用索引的策略

【mysql】mysql索引探索(三)-- 高效能使用索引的策略

既然我們已經對索引的本質有所瞭解,那麼我們就應該來討論如何高效能的使用引擎。

1. 列的離散性越高,選擇性越好。

列的離散性是這樣定義的:count(discount col):count(col),也就是不同的列數比列的總數。這個數值越大說明列的離散型就越好。

如果用離散性很低的列,比如性別來做索引,你會發現大家都只有兩種值(男和女),這樣其實你根本不知道應該往那條路走,區別度太低,選擇性很差。相反離散性越高的選擇性就越好。

就彷彿你喊男的會有50個男的回頭,你喊李二狗就只有李二狗回頭一樣。

2. 最左匹配原則

對索引中關鍵字進行的匹配,一定是從左往右依次進行的,且不可跳過。

這也就是我們常常說的,不要用like %這種寫法,左邊寫%會讓索引失效(字串就是用ASCII碼進行比較,資料庫可以選擇比較方式比如是否區分大小寫)。

3. 聯合索引使用原則

聯合索引其實就是有好多關鍵字的索引(但是關鍵字之間不是拼接,按照有分隔符把他分開來理解),單列索引這麼看來就是一種特殊的聯合索引。

總的來說一下聯合索引的使用原則吧:

1. 經常使用的列優先(最左匹配原則)

2. 選擇性高(離散性高)的列優先(離散度高原則)

3. 寬度小的列優先(最少空間原則)

我們來理解一下,因為從上面提到的最左匹配原則來看,我們肯定是最先匹配最左邊的列,所以最常用的列放在最左邊可以提高索引的覆蓋範圍。(僅對索引,查詢條件資料庫會重新組合不需要在意順序)

而選擇性高的列能幫助我們儘快的把資料區分開,這上面也說過了是離散度高原則。

寬度小的列優先,可以節省空間。

4. 覆蓋索引

如果查詢列可以通過索引節點中的關鍵字直接返回,則該索引稱之為覆蓋索引。

因為從我們的b+模型中可以看出,我們把所有關鍵字的資料資訊都留在了葉子節點,但關鍵字本身是儲存在非葉節點上的。也可就是說如果我們儲存在非葉節點上的關鍵字已經可以覆蓋這次返回所需的所有欄位,我們就可以直接命中返回,不需要往下查葉子節點了,這樣的好處是很明顯的。

覆蓋索引可以減少資料庫IO,將隨機IO變為順序IO,可提高查詢效能。