天天看點

mysq為什麼在varchar上的索引必須要指定索引長度

作者:夢幻随風
mysq為什麼在varchar上的索引必須要指定索引長度

對索引結構有一定認識,一般都會使用InnoDB存儲引擎,其對應的索引結構就是B+TREE。

B+TREE

mysq為什麼在varchar上的索引必須要指定索引長度

主鍵索引 : 索引和資料都在一顆樹的葉子節點,是存在一起的。通過定位索引就直接可以查找到資料

非主鍵索引 結構葉子節點存儲的是主鍵值

MySQL中就定義了16KB為一頁,一頁就是樹的一個節點。

既然一頁的大小是恒定的16KB,那也就意味着索引字段值占用的空間越小,

一頁能儲存的數量也就越多,最終就展現在減少磁盤IO的次數上。

在阿裡的Java開發手冊中,是強制要求varchar字段上建立索引必須要指定索引長度

分析也能看出,并不是這樣 所有索引的字段都适用 指定索引長度,比如區分度不高的、或者可以大量運用覆寫索引的實作的,我認為,開發手冊強調的普适場景,具體如何運用應該是我們通過了解原理之後,自行笃定。

是以并不是索引字段越小越好,而是要根據索引區分度的計算來進行評估。

查索引字段區分度的方式:

select
	count(distinct left(enterprise_name, 10)) / count(*) as '20',
	count(distinct left(enterprise_name, 11)) / count(*) as '21',
	count(distinct left(enterprise_name, 15)) / count(*) as '22',
	count(distinct left(enterprise_name, 18)) / count(*) as '23',
	count(distinct left(enterprise_name, 28)) / count(*) as '28',
	count(distinct left(enterprise_name, 30)) / count(*) as '30',
	count(distinct left(enterprise_name, 32)) / count(*) as '32'
from
	enterprise_dft;
           
mysq為什麼在varchar上的索引必須要指定索引長度

可以看出從擷取長度為22開始,區分度已經接近1,再增加長度成本效益已經不高了。

索引對于 enterprise_name 字段設定 索引長度 為 26 比較合适。

alter table enterprise_dft

add

index idx_enterprise_name(enterprise_name(26));

區分度技巧

有些字段的特征在于,前面大多數部分都是相同的,隻是後面幾位不同,對于這樣的字段我們保留前幾位作為索引字段是不行的,那實際上可以通過倒序存儲的方式來滿足。

除了倒序存儲的方式,還可以使用Hash的方式,但是要注意存在Hash沖突的問題

繼續閱讀