1. 程式人生 > >一種可衡量的確定MySQL字首索引長度方法

一種可衡量的確定MySQL字首索引長度方法

字首索引,是指對於varchar/text/blob型別的欄位建立索引時一般都會選擇前N個字元作為索引。索引很長的字元列,會讓索引變得大且慢。索引開始的部分字元,這樣可以大大節約索引空間,從而提高索引效率,但這樣也會降低索引的選擇性。索引的選擇性是指不重複的索引值(也稱為基數,cardinality)和資料表的記錄總數的比值。
計算公式:

SELECT COUNT(DISTINCT(a))/COUNT(*) FROM table1;

比值約接近於1,說明選擇性越好,說明不重複的值的行數約接近總數。

那怎麼選擇一個varchar/text/blob的欄位應該選擇前N個字元呢?如何確定N的大小呢?有沒有科學衡量的方法?
答案是有的。


計算方法如下:

mysql> SELECT COUNT(DISTINCT(a))/COUNT(*) e,
    -> COUNT(DISTINCT(LEFT(a,1)))/COUNT(*) e1,COUNT(DISTINCT(LEFT(a,2)))/COUNT(*) e2,COUNT(DISTINCT(LEFT(a,3)))/COUNT(*) e3,
    -> COUNT(DISTINCT(LEFT(a,4)))/COUNT(*) e4,COUNT(DISTINCT(LEFT(a,5)))/COUNT(*) e5,COUNT(DISTINCT(LEFT(a,6)))/COUNT(*) e6,
    -> COUNT(DISTINCT(LEFT(a,7)))/COUNT(*)
e7,COUNT(DISTINCT(LEFT(a,8)))/COUNT(*) e8 FROM text_blob; +--------+--------+--------+--------+--------+--------+--------+--------+--------+ | e | e1 | e2 | e3 | e4 | e5 | e6 | e7 | e8 | +--------+--------+--------+--------+--------+--------+--------+--------+--------+ | 1.0000 | 0.0225 | 0.4663 | 0.8618 | 0.9734 | 0.9958 | 0.9992 | 0.9992 | 1.0000 | +--------+--------+--------+--------+--------+--------+--------+--------+--------+ 1 row in set (0.02 sec)

left按照不同的長度計算比值,找到一個和完整列比例接近的值,比如上面e5前5個長度比例達到0.9958,已經很接近1了,綜合考慮比較合適。
最後,開開心心把索引建上:)

ALTER TABLE text_blob ADD KEY (a(5));