高效的選擇和使用索引有不少方式,有的是針對特殊案例的優化方法,有的則是針對特定行爲的優化,使用哪一個索引,以及如何評估選擇不一樣索引的性能影響的技巧,則須要持續不斷地學習。(本文章須要必定索引基礎)mysql
1.索引要是獨立的列sql
「獨立的列」是指索引列不能是表達式的一部分,也不能是函數的參數。例如,下面這個查詢沒法使用actor_id列的索引函數
mysql>SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;性能
憑肉眼很容易看出WHERE中的表達式其實等價與 actor_id = 4,可是MySQL沒法自動解析這個方程式。這徹底是用戶行爲。咱們應該養成簡化WHERE條件的習慣,始終將索引列單獨放在比較符號的一側學習
下面是另外一個常見的錯誤:優化
mysql>SELECT ... WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;spa
2.前綴索引和索引的選擇性索引
索引的選擇性: ci
索引的選擇性是指 不重複的索引值(也稱之爲基數)和數據表記錄總數(#T)的比值,範圍從1/#T到1之間。索引的選擇性越高則查詢效率越高。惟一索引的選擇性是一,這是最好的索引選擇性,性能也是最好的。it
對於BLOB、TEXT或者很長的VARCHAR類型的列。必須使用前綴索引,由於mysql不容許索引這些列的完整長度。
前綴索引選擇前綴長度的訣竅在於選擇足夠長的前綴以保證較高的選擇性,通知用不能太長(以便節約空間),足夠長的長度以使得前綴索引的選擇性接近於索引的整個列
如何計算合適的前綴長度?
計算整列的選擇性,並使前綴的選擇性接近完成列的選擇性
計算完整列的選擇性
mysql>SELECT COUNT(DISTINCT city)/COUNT(*) city_demo;
計算不一樣前綴長度的選擇性:
mysql>SELECT COUNT(DISTINCT LEFT(city, 3))/COUNT(*) AS sel3,
COUNT(DISTINCT LEFT(city, 4))/COUNT(*) AS sel4,
COUNT(DISTINCT LEFT(city, 5))/COUNT(*) AS sel5,
COUNT(DISTINCT LEFT(city, 6))/COUNT(*) AS sel6,
COUNT(DISTINCT LEFT(city, 7))/COUNT(*) AS sel7,
FROM city_demo;
求出的前綴選擇性接近於完整列的選擇性基本上就能夠用了,但要注意,只看平均選擇性是不夠的,也有例外的狀況須要考慮最壞狀況下的選擇性。
前面已經說明如何找到合適的前綴長度,下面掩飾一下如何建立前綴索引
mysql>ALTER TABLE city_demo ADD KEY (city(7));