字首索引 索引選擇性

2021-06-29 00:30:21 字數 1336 閱讀 9653

字首索引/索引選擇性

如果有很長的字元,如 blog, text, 如果索引這個列,索引會很大,而且 mysql 也不支援對這種列進行索引.所以需要字首索引,對這些索引的前面幾個字元進行索引.

為了讓這種索引效率最高,也就是查詢出來的結果最真實,先要確定需要索引前面幾個字元.示例:

select count(*) as cnt, city from my_table group by city order by cnt desc limit 10;

該語句查詢訪問量排前十的城市及它的訪問量.假定 city 欄位是很長的字串.

然後再用語句:

select count(*) as cnt, left(city, 3) as pref from my_table group by city order by cnt desc limit 10;

group by 的內容變成了

left(city, 3)

當然,該語句查詢了的結果可能和前面不一樣. left 的第二個引數越長,肯定越準確.多試幾次,索引選擇性最高的數值.

索引的選擇性是指不重複的索引列數和資料表的記錄總數的比值.索引的選擇性越高則查詢效率越高.因為它可以讓 mysql 在查詢時過濾掉更多的行,唯一索引的選擇性是 1, 這是最好的索引選擇性,效能也是最好的.

計算方式可能是: select count(distinct city) / count(*) from my_table;

上面找出最高選擇性的辦法:

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 ,

from my_table

結果:sel3 sel4 sel5 sel6 sel7

0.0239 0.0293 0.0305 0.0309 0.0310

看出,從 sel7 開始,上公升的幅度已經很少了,如果再往後增成 8, 9 一樣.所以,選擇 7 即可.有些時候為了效率考慮,可以選擇更低的 5, 6

我們就可以建立字首索引:

alter table my_table add key(city(7));

字首索引的缺點是, mysql 無法使用字首索引做 order by, group by.

MySQL索引之字首索引和索引選擇性

有時需要索引很長的字元列,它會使索引變大而且變慢。乙個策略就是模擬雜湊索引。但是有時這也不夠好,那?通常可以索引開始的幾個字元,而不是全部值,以節約空間並得到好的效能。這使索引需要的空間變小,但是也會降低選擇性。索引選擇性是不重複的索引值 和表中所有行的比值。高選擇性的索引有好處,因為它使mysql...

MySQL索引之字首索引和索引選擇性

有時需要索引很長的字元列,它會使索引變大而且變慢。乙個策略就是模擬雜湊索引。但是有時這也不夠好,那?通常可以索引開始的幾個字元,而不是全部值,以節約空間並得到好的效能。這使索引需要的空間變小,但是也會降低選擇性。索引選擇性是不重複的索引值 和表中所有行的比值。高選擇性的索引有好處,因為它使mysql...

MySQL建立字首索引和索引選擇性

天忽作晴山卷慢,雲猶含態石披衣 什麼是字首索引 一般情況下,如果需要作為索引的那一列長度很長.就需要使用字首索引來節約索引控制項.即只需要為前面幾個字元作為索引.什麼是索引選擇性 索引選擇性是指,不重複的索引值 也稱為基數 和資料表的記錄總數 t 的比值,範圍從1 t到1之間.索引選擇性越高則查詢效...