mysql前綴索引及其選擇

索引的選擇性:
    是指不重複的索引值(也稱基數)和數據表的記錄總數(#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原生並不支持反向索引,但是可以把字符串反轉存儲,並基於此建立前綴索引。可以通過觸發器來維護這種索引。

以上內容總結自《高性能MYSQL》5.3.2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章