mysql索引长度与区分度的选择理想的索引
查询频繁
区分度⾼
长度⼩
尽量能覆盖常⽤查询字段
索引长度直接影响索引⽂件的⼤⼩,影响增删改的速度,并间接影响查询速度(占⽤内存多).
针对列中的值,从左往右截取部分,来建索引
1: 截的越短, 重复度越⾼,区分度越⼩, 索引效果越不好
2: 截的越长, 重复度越低,区分度越⾼, 索引效果越好,但带来的影响也越⼤--增删改变慢,并间影响查询速度.
所以, 我们要在 区分度 + 长度 两者上,取得⼀个平衡.
惯⽤⼿法: 截取不同长度,并测试其区分度
案例:
这⾥准备了⼀张表,其表结构如下
索引情况如下:
在⽣产环境中,经常需要使⽤到dye_vat这个字段来查询,那么这个字段该怎么建⽴索引⽐较合理呢?
varchar2最大长度
这⾥我们依据,字符长度和区分度来计算怎么建索引⽐较合理!
可以看到在这个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,索引的性能就可以接受。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论