字首索引例項說明

2021-10-19 11:08:58 字數 2129 閱讀 2279

​ 有時候需要索引很長的字串,這會讓索引變的大且慢,通常情況下可以使用某個列開始的部分字串,這樣大大的節約索引空間,從而提高索引效率,但這會降低索引的選擇性,索引的選擇性是指不重複的索引值和資料表記錄總數的比值,範圍從1/#t到1之間。索引的選擇性越高則查詢效率越高,因為選擇性更高的索引可以讓mysql在查詢的時候過濾掉更多的行。

​ 一般情況下某個列字首的選擇性也是足夠高的,足以滿足查詢的效能,但是對應blob,text,varchar型別的列,必須要使用字首索引,因為mysql不允許索引這些列的完整長度,使用該方法的訣竅在於要選擇足夠長的字首以保證較高的選擇性,通過又不能太長。

案例演示:

--建立資料表

create

table citydemo(city varchar(50

)not

null);

insert

into citydemo(city)

select city from city;

--重複執行5次下面的sql語句

insert

into citydemo(city)

select city from citydemo;

--更新城市表的名稱

update citydemo set city=

(select city from city order

by rand(

)limit1)

;--查詢最常見的城市列表,發現每個值都出現45-65次,

select

count(*

)as cnt,city from citydemo group

by city order

by cnt desc

limit10;

--查詢最頻繁出現的城市字首,先從3個字首字母開始,發現比原來出現的次數更多,可以分別擷取多個字元檢視城市出現的次數

select

count(*

)as cnt,

left

(city,3)

as pref from citydemo group

by pref order

by cnt desc

limit10;

select

count(*

)as cnt,

left

(city,7)

as pref from citydemo group

by pref order

by cnt desc

limit10;

--此時字首的選擇性接近於完整列的選擇性

--還可以通過另外一種方式來計算完整列的選擇性,可以看到當字首長度到達7之後,再增加字首長度,選擇性提公升的幅度已經很小了

select

count

(distinct

left

(city,3)

)/count(*

)as sel3,

count

(distinct

left

(city,4)

)/count(*

)as sel4,

count

(distinct

left

(city,5)

)/count(*

)as sel5,

count

(distinct

left

(city,6)

)/count(*

)as sel6,

count

(distinct

left

(city,7)

)/count(*

)as sel7,

count

(distinct

left

(city,8)

)/count(*

)as sel8

from citydemo;

--計算完成之後可以建立字首索引

alter

table citydemo add

key(city(7)

);--注意:字首索引是一種能使索引更小更快的有效方法,但是也包含缺點:mysql無法使用字首索引做order by 和 group by。

字首索引例項說明

有時候需要索引很長的字串,這會讓索引變的大且慢,通常情況下可以使用某個列開始的部分字串,這樣大大的節約索引空間,從而提高索引效率,但這會降低索引的選擇性,索引的選擇性是指不重複的索引值和資料表記錄總數的比值,範圍從1 t到1之間。索引的選擇性越高則查詢效率越高,因為選擇性更高的索引可以讓mysql在...

mysql 建字首索引 MySQL 字首索引

檢視出現頻率 select count as cnt,city from sakila.city demo group by city order by cnt desc limit 10 1.select count distinct city count from sakila.city dem...

mysql 字首索引 語法 MySQL 字首索引

索引字首 使用 字串列的索引規範中的語法,您可以建立僅使用列首字元的索引 以這種方式僅索引列值的字首可以使索引檔案小得多。為a 或 column 編制索引時 必須為索引指定字首長度。例如 col name n nblobtext create table test blob col blob,ind...