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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值