mysql 索引長度與區分度的選擇

理想的索引

  • 查詢頻繁 
  • 區分度高  
  • 長度小  
  • 儘量能覆蓋常用查詢字段

索引長度直接影響索引文件的大小,影響增刪改的速度,並間接影響查詢速度(佔用內存多).

針對列中的值,從左往右截取部分,來建索引
1: 截的越短, 重複度越高,區分度越小, 索引效果越不好
2: 截的越長, 重複度越低,區分度越高, 索引效果越好,但帶來的影響也越大--增刪改變慢,並間影響查詢速度.

所以, 我們要在  區分度 + 長度  兩者上,取得一個平衡.

慣用手法: 截取不同長度,並測試其區分度

案例:

 這裏準備了一張表,其表結構如下

   

索引情況如下:

在生產環境中,經常需要使用到dye_vat這個字段來查詢,那麼這個字段該怎麼建立索引比較合理呢?

這裏我們依據,字符長度和區分度來計算怎麼建索引比較合理!

可以看到在這個25141條記錄的表中,當字符長度爲13時,區分度是最高的,但是後面也看到了,現有表dye_vat 這個字段最大長度也才13,所以我們建立索引的時候不可能以13字符長度建立索引( 就目前來看不太合理) 。

將以上數據,通過excel 分析

 

由上表可以看出,將索引長度建在8-11 是比較合理的,這裏我們將索引長度選擇在10,建立索引。

建立索引:

alter table dye_stock_picode add index dye_vat(dye_vat(10)); 

 

這裏說下ken_len :32 是怎麼來的,在utf8 下一個字符佔3個字節,我們的索引dye_vat 是10個長度的,所以 3 * 10 ,加上varchar類型長度會保留1~2 字節。

在我這個案例中,索引長度選擇爲了10,這個案例中,辨識度普遍較低,可能是由於數據問題(數據不夠多之類的),在遇到要對字符串建立索引這類問題中,一般要看業務場景,具體問題具體分析。

注:對於一般的系統應用: 區別度能達到0.1,索引的性能就可以接受。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章