索引使用原则-列的离散(sàn)度
生活随笔
收集整理的這篇文章主要介紹了
索引使用原则-列的离散(sàn)度
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第一個叫做列的離散度,我們先來看一下列的離散度的公式:
count(distinct(column_name)) : count(*),列的全部不同值和所有數據行的比例。數據行數相同的情況下,分子越大,列的離散度就越高。
簡單來說,如果列的重復值越多,離散度就越低,重復值越少,離散度就越高。
了解了離散度的概念之后,我們再來思考一個問題,我們在name 上面建立索引和在gender 上面建立索引有什么區別。
當我們用在gender 上建立的索引去檢索數據的時候,由于重復值太多,需要掃描的行數就更多。例如,我們現在在gender 列上面創建一個索引,然后看一下執行計劃。
ALTER TABLE user_innodb DROP INDEX idx_user_gender; ALTER TABLE user_innodb ADD INDEX idx_user_gender (gender); -- 耗時比較久 EXPLAIN SELECT * FROM `user_innodb` WHERE gender = 0; show indexes from user_innodb;而name 的離散度更高,比如“青山”的這名字,只需要掃描一行。
ALTER TABLE user_innodb DROP INDEX idx_user_name; ALTER TABLE user_innodb ADD INDEX idx_user_name (name); EXPLAIN SELECT * FROM `user_innodb` WHERE name = 'leon';查看表上的索引,Cardinality [kɑ:d?'n?l?t?] 代表基數,代表預估的不重復的值的數量。索引的基數與表總行數越接近,列的離散度就越高。
show indexes from user_innodb;如果在B+Tree 里面的重復值太多,MySQL 的優化器發現走索引跟使用全表掃描差不了多少的時候,就算建了索引,也不一定會走索引。
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
這個給我們的啟發是什么?建立索引,要使用離散度(選擇度)更高的字段。
?
總結
以上是生活随笔為你收集整理的索引使用原则-列的离散(sàn)度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL 数据存储文件
- 下一篇: 索引使用原则-联合索引最左匹配