mysql建立組合索引原則
阿新 • • 發佈:2019-01-28
現實中,mysql可以根據業務需要建立組合索引,由於mysql使用B-Tree格式索引,可以直接定位記錄,無需掃描。mysql建立多列索引有最左字首的原則,即最左優先,如:
如果有一個2列的索引(col1,col2),則已經對(col1)、(col1,col2)上建立了索引;
如果有一個3列索引(col1,col2,col3),則已經對(col1)、(col1,col2)和(col1,col2,col3)上建立了索引;
如何建立組合索引?
最頻繁使用的列放在左邊;
檢視列的選擇性(即該列的索引值數量與記錄數量的比值),比值越高,效果越好;
例如使用者表,如果按照使用者姓名查詢比較多,可以考慮在根據姓名建立索引。這裡有兩種形式:1在使用者的名字欄位(name)在做索引。2,在使用者的名字和姓氏欄位建立索引(name+family_name)。我們查看了下name欄位的選擇性,執行如下語句。
SELECT count(DISTINCT(name))/count(*) AS Selectivity FROM user;
+-------------+
| Selectivity |
+-------------+
| 0.0052 |
+-------------+
發現值非常小,因為name相同的使用者實在太多。 再檢視下name+family_name的選擇性。
SELECT count(DISTINCT(concat(name, family_name)))/count(*) AS Selectivity FROM user;
+-------------+
| Selectivity |
+-------------+
| 0.9563 |
+-------------+
發現名字完全相同的員工基本沒有。但是索引key如果太長會使得索引檔案變大並且維護開銷增大,name+family name的長度等於30,還是希望有一個艱鉅選擇性和長度的方案。 因此可以考慮在name和family前自己字元上面建立索引,例如 name + left(family_name,5):
SELECT count(DISTINCT(concat(name, left(family_name,5))))/count(*) AS Selectivity FROM user;
+-------------+
| Selectivity |
+-------------+
| 0.9012 |
+-------------+
如果有一個2列的索引(col1,col2),則已經對(col1)、(col1,col2)上建立了索引;
如果有一個3列索引(col1,col2,col3),則已經對(col1)、(col1,col2)和(col1,col2,col3)上建立了索引;
如何建立組合索引?
最頻繁使用的列放在左邊;
檢視列的選擇性(即該列的索引值數量與記錄數量的比值),比值越高,效果越好;
例如使用者表,如果按照使用者姓名查詢比較多,可以考慮在根據姓名建立索引。這裡有兩種形式:1在使用者的名字欄位(name)在做索引。2,在使用者的名字和姓氏欄位建立索引(name+family_name)。我們查看了下name欄位的選擇性,執行如下語句。
SELECT count(DISTINCT(name))/count(*) AS Selectivity FROM user;
+-------------+
| Selectivity |
+-------------+
| 0.0052 |
+-------------+
發現值非常小,因為name相同的使用者實在太多。 再檢視下name+family_name的選擇性。
SELECT count(DISTINCT(concat(name, family_name)))/count(*) AS Selectivity FROM user;
+-------------+
| Selectivity |
+-------------+
| 0.9563 |
+-------------+
發現名字完全相同的員工基本沒有。但是索引key如果太長會使得索引檔案變大並且維護開銷增大,name+family name的長度等於30,還是希望有一個艱鉅選擇性和長度的方案。 因此可以考慮在name和family前自己字元上面建立索引,例如 name + left(family_name,5):
SELECT count(DISTINCT(concat(name, left(family_name,5))))/count(*) AS Selectivity FROM user;
+-------------+
| Selectivity |
+-------------+
| 0.9012 |
+-------------+
雖然不如以name+family_name的選擇性高,但是已經基本滿足要求。