有時候需要索引很長的字串,這會讓索引變的大且慢,通常情況下可以使用某個列開始的部分字串,這樣大大的節約索引空間,從而提高索引效率,但這會降低索引的選擇性,索引的選擇性是指不重複的索引值和資料表記錄總數的比值,範圍從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...