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,索引的性能就可以接受。

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