日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

索引使用原则-列的离散(sàn)度

發布時間:2024/4/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 索引使用原则-列的离散(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)度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。