索引的選擇性:
是指不重複的索引值(也稱基數)和數據表的記錄總數(#T)的比值,範圍從1/#T到1之間。索引的選擇性越高則查詢效率越高,因爲選擇性高的索引可以讓MySQL在查找時過濾更多的行。唯一索引的選擇性是1,這是最好的索引選擇性,性能也是最好的。
爲了保證前綴索引有較高的選擇性,同時又不能太長可以使用計算完整列的選擇性,並使前綴的索引性接近於完整列的選擇性,方法如下:
第一步:計算完整列的選擇性:
表名:city_demo, city是城市名稱字段
mysql>SELECT COUNT(DISTINCT `city`)/COUNT(*) FROM `city_demo`;
顯示結果:
+---------------------------------+
| COUNT(DISTINCT `city`)/COUNT(*) |
+-----------------+----------+-----
| 0.0312|
+---------------------------------+
也就是說前綴索引的選擇性能夠接近0.031,那麼該長度的索引就可以用了。
第二步:計算不同前綴長度的選擇性
mysql> SELECT COUNT(DISTINCT LEFT(`city`,3))/COUNT(*) AS sel3,
mysql> COUNT(DISTINCT LEFT(`city`,4))/COUNT(*) AS sel4,
mysql> COUNT(DISTINCT LEFT(`city`,5))/COUNT(*) AS sel5,
mysql> COUNT(DISTINCT LEFT(`city`,6))/COUNT(*) AS sel6,
mysql> COUNT(DISTINCT LEFT(`city`,7))/COUNT(*) AS sel7
mysql> FROM `city_demo`;
顯示結果:
+-------+-------+-------+-------+-------+
| sel3 | sel4 | sel5 | sel6 | sel7 |
+-------+-------+-------+-------+-------+
| 0.239 |0.0293 |0.0305 |0.0309 |0.0310 |
+-------+-------+-------+-------+-------+
查詢結果顯示當前綴長度達7的時候,前綴長度的選擇性接近完整列的選擇性,再增加前綴長度,選擇性提升的幅度已經很小了。
第三步:創建前綴索引
mysql> ALTER TABLE `city_demo` ADD KEY(city(7));
其他
前綴索引缺點
MySQL 無法使用前綴索引做ORDER BY 和GROUP BY,也無法使用前綴索引做覆蓋掃描
前綴索引擴展
有時候後綴索引也有用途(例如,找到某個域名的所有電子郵件地址)。MySQL原生並不支持反向索引,但是可以把字符串反轉存儲,並基於此建立前綴索引。可以通過觸發器來維護這種索引。