前言:
今天各位老铁们对“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 判断字段长度