資料庫索引和選擇性的關係

2021-09-24 10:19:36 字數 1134 閱讀 1134

為什麼80%的碼農都做不了架構師?>>>

:雨中等待

在討論資料庫索引的時候,經常會提到「選擇性」(selectivity)這個概念。「選擇性」是描述列值資料分布情況的乙個重要屬性。「選擇性」和「基數」(cardinality)是兩個密不可分的概念。「基數」就是一列中唯一值的數量,對於有唯一約束的列,「基數」等於表的總行數。

選擇性  =  基數/總行數 * 100%
選擇性是什麼意思?上面的公式應該怎麼理解?假設表中有***(性別)這一列,列值只有兩種可能—`male`(男性)和`female`(女性),那麼,***列的基數(cardinality)就是2。如果這張表中有10000條行記錄,那麼***列的索引的選擇性就是2/10000 * 100% = 0.02%。

為什麼「選擇性」對索引很重要,資料庫怎麼利用「選擇性」的?

「選擇性」的高低可以衡量列值的可能性,換句話說,在給定的樣本集裡有多少個不同的值。

我們思考一下,低選擇性意味著什麼?低選擇性意味著列值沒有太多變化(或沒有太多的可能性)。例如,***列的選擇性,只有非常低的0.02%,這就意味著,***列的列值有很少的不同值。

資料庫的查詢優化器會根據索引的「選擇性」來判斷是否使用索引執行查詢。也就是說,你在某列上建立了索引,這不意味著資料庫就一定會使用這個索引,因為有時全表掃瞄是更高效的選擇。

什麼時候不應該使用資料庫索引?當「選擇性」比較低的時候!為什麼低選擇性的時候不適合使用索引呢?設想一下,現在我們要查詢所有女性的名字,由於性別只有男性和女性兩種情況,所以女性佔比是50%的可能性很大。那我們就假設確實有50%(5000)是女性。如果查詢索引的話,資料庫為了查詢出所有女性就需要訪問索引5000次。要知道訪問索引也是需要消耗時間和資源的。所以這種情況,直接去做全表掃瞄可能會更快一些。可以看到,資料庫的查詢優化器會根據「選擇性」的高低來決定使用索引還是直接全表掃瞄。

這個問題很難回答,它因資料庫而異。

當然,「選擇性」很高時,應該使用索引。例如,我們要查詢的某列,其「選擇性」是100%,說明該列的列值都是唯一的。這時,如果只查詢其中的一行,使用索引是最高效的。同時,這也是執行全表掃瞄最壞的情形。

mysql選擇性 Mysql索引的選擇性

對於索引的使用,mysql並不一直都是用採用正確的決定的。參考乙個簡單的表 create table r2 id int 11 default null,id1 int 11 default null,cname varchar 32 default null,key id1 id1 engine ...

索引的選擇性

索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記 錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980 2000 0.99。乙個索引的選擇性越接近於1,這個索引的效率就越高。如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於...

索引的選擇性

索引的選擇性是指索引列中不同值的數目與表中記錄數的比。如果乙個表中有2000條記 錄,表索引列有1980個不同的值,那麼這個索引的選擇性就是1980 2000 0.99。乙個索引的選擇性越接近於1,這個索引的效率就越高。如果是使用基於cost的最優化,優化器不應該使用選擇性不好的索引。如果是使用基於...