1. 程式人生 > 其它 >MySQL45講之字首索引

MySQL45講之字首索引

本文介紹字串的字首索引優缺點,以及字串區分度不高情況下,可以考慮如何建立索引。

前言

本文介紹字串的字首索引優缺點,以及字串區分度不高情況下,可以考慮如何建立索引。

字首索引

對於像SELECT * FROM t WHERE email = '[email protected]'的查詢語句,如果不對email列建立索引,那麼將會進行全表掃描。

對字串建立索引,可以對整個字串建立索引,也可以只對前幾個字元建立索引,第二者就是所謂的字首索引方式。

優點

節省儲存空間。如果字串長度比較長,需要對整個字串建立索引,那麼索引樹佔用的儲存空間時很大的。而如果只是對前一部分字元建立索引,那麼可以很好的節省儲存空間。

缺點

1、可能會增加掃描行數,影響查詢效能。因為整個字串可能不相同,但是字首可能是相同的,導致使用字首索引時,需要更多的回表掃描行。

所以,建立字首索引前需要找到區分度最高的字首。可以通過SELECT COUNT(distinct email(n)) FROM t;計算字首不同的行數,和表的總行數比較,得到區分度最高的字首。

2、索引覆蓋失效。比如SELECT id, email FROM t WHERE email = '[email protected]',可以使用覆蓋索引,但因為索引樹只有字串部分資料,必須回表拿資料,即索引覆蓋失效。

字串區分度不高時

對於只存在字串的等值查詢場景,且整個字串區分度不高的情況,可以考慮如何建立索引?

1、儲存逆序字串並建立索引。適用於原始字串字首的區分度不高,但字串末尾區分度高的場景,查詢語句為SELECT * FROM t WHERE email = reverse([email protected])

2、新建立一列,內容為原始字串的crc32雜湊值,並對雜湊值這列建立索引。適用於整個字串前後部分割槽分度都不高的場景,查詢語句為SELECT * FROM t WHERE crc_col = crc32('[email protected]') and email = '[email protected]'。因為可能發生雜湊衝突,所以需要再比較下字串值。

注意,字首索引目的在於節省儲存空間,但相應地也增加了開發轉換的複雜度和錯誤的風險。儲存資源足夠的情況下,建議優先考慮整個字串索引方式。