首先 索引長度和區分度是相互矛盾的,mysql
索引長度過短,那麼區分度就很低,吧索引長度加長,區分度就高,可是索引也是要佔內存的,因此咱們須要找到一個平衡點;sql
那麼這個平衡點怎麼來定?數據庫
好比用戶表有個字段 username ,要給他加索引,問題是索引長度多少合適?大數據
其實咱們知道 百家姓裏面有百多個姓 ,可是大多數人的姓 集中在前十多個;若是我設置索引索引長度爲1,對染佔內存少,可是區分度低,url
區分度低索引的效率越低。太長則佔內存;spa
首先你要知道 mysql的索引都是排好序的。若是區分度高排序越快,區分度越低,排序慢;code
舉個例子: (張,張三,張三哥),若是索引長度取1的話,那麼每一行的索引都是 張 這個字,徹底沒有區分度,你讓他怎麼排序?結果這樣三行徹底是隨機排的,由於索引都同樣;blog
若是長度取2,那麼排序的時候至少前兩個是排對了的,若是取3,區分度達到100%,排序徹底正確;排序
等等,那你說是否是索引越長越好? 答案確定是錯的,好比 (張,李,王) 和 (張三啦啦啦,張三呵呵呵,張三呼呼呼);前者在內存中排序佔得空間少,排序也快,後者明顯更慢更佔內存,在大數據應用中這一點點都是很恐怖的;索引
因此要作一個取捨;這個取捨不是沒有一個固定的量;須要跟你本身的數據庫裏面的數據來判斷;比較常規的公式是:
test是要加索引的字段,5是索引長度,
select count(distinct left(test,5))/count(*) from table;
求出一個浮點數,這個浮點數是逐漸趨向1的,網上找了個圖片來分析下;
這個地方觀察到,當索引長度達到4的時候就已經趨向1了,因此長度設爲4是最佳的,在大點增長的索引效果已經很小了,這個地方不是說必須接近1才行;
其實這個值達到0.1就已經能夠接受了;總之要找一個平衡點;
還有一些特殊的字段常規方法用起不太順暢,好比有一個url字段,絕大部分的url都是 http://www. 開頭的
這種狀況下索引長度取取到11都是無效的,須要更長的索引,那麼有沒有優雅的方式來解決呢;
第一種方法: 能夠將數據倒序存入數據庫;
第二種方法:對字符串進行crc32哈希處理;
兩種方法都不錯,固然要配合客戶端程序完成;