MySQL索引對數據檢索的性能相當重要,盲目的增長索引不只不能帶來性能的提高,反而會消耗更多的額外資源,本篇總結了一些MySQL索引實戰經驗。數據庫
索引是用於快速查找記錄的一種數據結構。索引就像是數據庫中數據的目錄,數據庫在查詢時,首先在索引中找到匹配的值,而後根據這個匹配值找到對應的數據行。數據結構
聚簇索引的順序就是數據的物理存儲順序,索引中數據域存儲的就是實際的數據,一個表最多隻能有一個聚簇索引,適用於查詢多行數據,不適用於頻繁修改的列,通常在主鍵上建立。函數
索引順序與數據物理排列順序無關,索引中存儲的內容爲實際數據的地址,適應於查詢單行數據。性能
即平時建立的普通索引。排序
索引所在的列或列組合的值是全表惟一的。索引
MySQL從3.23.23版開始支持全文索引,它查找的是文中的關鍵詞,而不是直接比較索引中的值。資源
在單列上建立的索引。io
在多個列上建立的索引。效率
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=?。nio
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。
關於索引的實戰經驗總結後續還會不斷更新。