字符索引优化

字符索引优化

引入

假如有一个系统,使用的是邮箱作为账号的,每次登陆都要查询邮箱,如果不给邮箱加索引的话,每一次查询都是全表查询,所以给邮箱加索引是必需的,但是如果给邮箱加普通索引的话又感觉浪费空间

前缀索引

添加索引

普通索引
alter table SUser add index index1(email);
前缀6的索引
alter table SUser add index index2(email(6));

索引结构

搜索区别

select id,email from SUser where email='zhangssxyz@xxx.com'

使用index1

1.直接搜索index1的索引树,找到zhangssxyz@xxx.com这条记录

2.然后查下一条记录,如果满足条件了就直接返回结果集(覆盖索引)

使用index2

1.直接搜索index2的索引树,找到zhangs这条记录

2.回表查询邮箱是否满足

3.继续下一条记录

注意

使用了前缀索引就不能使用覆盖索引了

前缀索引的总结

1.可以节省索引的存储空间,又不会增加太多的查询成本(有前提,本来就存在着回表操作,而且设置了合适的前缀索引长度)

2.无法使用覆盖索引的优化

如何设置合理的前缀索引

1.前缀索引长度

通过案例我们知道,要是前缀索引长度设置的不合理会额外的增加许多的额外查询

select count(distinct email) as L from SUser;
select count(distinct left(email,4))as L4, count(distinct left(email,5))as L5, count(distinct left(email,6))as L6, count(distinct left(email,7))as L7,from SUser;

可以用以上语句查询前缀的重复率,以不重复率95%为界限,前缀越短越好

2.反转

比方说身份证号,前几位都是省市的编码,存在着大量的重复,然而最后几位却是无序的,我们可以倒着存,这样就可以更有效了

3.对字符串进行hash等算法的计算唯一值

需要新加一个字段,但是可能会存在重复,但是索引的长度更短了

总结

如果必须要用的字符为索引,需要考虑到很多东西,比方说数据量,数据量少的话,就不用优化了,可靠安全,而且简单

参考链接

https://time.geekbang.org/column/article/71492

原文地址:https://www.cnblogs.com/zx125/p/11750036.html