龙空技术网

mysq为什么在varchar上的索引必须要指定索引长度

梦幻随风的互联网笔记 110

前言:

今天各位老铁们对“mysql 判断字段长度”大致比较关切,你们都需要剖析一些“mysql 判断字段长度”的相关知识。那么小编在网络上搜集了一些有关“mysql 判断字段长度””的相关文章,希望大家能喜欢,姐妹们快快来学习一下吧!

对索引结构有一定认识,一般都会使用InnoDB存储引擎,其对应的索引结构就是B+TREE。

B+TREE

主键索引 : 索引和数据都在一颗树的叶子节点,是存在一起的。通过定位索引就直接可以查找到数据

非主键索引 结构叶子节点存储的是主键值

MySQL中就定义了16KB为一页,一页就是树的一个节点。

既然一页的大小是恒定的16KB,那也就意味着索引字段值占用的空间越小,

一页能保存的数量也就越多,最终就体现在减少磁盘IO的次数上。

在阿里的Java开发手册中,是强制要求varchar字段上建立索引必须要指定索引长度

分析也能看出,并不是这样 所有索引的字段都适用 指定索引长度,比如区分度不高的、或者可以大量运用覆盖索引的实现的,我认为,开发手册强调的普适场景,具体如何运用应该是我们通过了解原理之后,自行笃定。

所以并不是索引字段越小越好,而是要根据索引区分度的计算来进行评估。

查索引字段区分度的方式:

select	count(distinct left(enterprise_name, 10)) / count(*) as '20',	count(distinct left(enterprise_name, 11)) / count(*) as '21',	count(distinct left(enterprise_name, 15)) / count(*) as '22',	count(distinct left(enterprise_name, 18)) / count(*) as '23',	count(distinct left(enterprise_name, 28)) / count(*) as '28',	count(distinct left(enterprise_name, 30)) / count(*) as '30',	count(distinct left(enterprise_name, 32)) / count(*) as '32'from	enterprise_dft;

可以看出从获取长度为22开始,区分度已经接近1,再增加长度性价比已经不高了。

索引对于 enterprise_name 字段设置 索引长度 为 26 比较合适。

alter table enterprise_dft

add

index idx_enterprise_name(enterprise_name(26));

区分度技巧

有些字段的特征在于,前面大多数部分都是相同的,只是后面几位不同,对于这样的字段我们保留前几位作为索引字段是不行的,那实际上可以通过倒序存储的方式来满足。

除了倒序存储的方式,还可以使用Hash的方式,但是要注意存在Hash冲突的问题

标签: #mysql 判断字段长度