理想的索引
- 查询频繁
- 区分度高
- 长度小
- 尽量能覆盖常用查询字段
索引长度直接影响索引文件的大小,影响增删改的速度,并间接影响查询速度(占用内存多).
针对列中的值,从左往右截取部分,来建索引
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,索引的性能就可以接受。