mysql如何给字符串字段加索引

现在许多系统支持邮箱登录,给这样的字段设置索引

第一种:给String字段创建完整索引
alter table User add index index(email);

这种方式创建的索引,只需要回到主键索引上取一次值,但是比较占用空间

第二种:给String字段创建前缀索引
alter table SUser add index index(email(6));

这种方式创建索引,比如查询email=“[email protected]”,根据email(6)从 index索引树找到满足索引值是’zhangs’的记录获得ID值,再到主键索引上取到email,比较email值是否等于[email protected],不相等就会再重复以上操作直到没有满足索引值。可以发现使用前缀索引会多次查询读数据会变多。

注意点:占用空间会少,使用前缀所以用不上覆盖索引对查询性能的优化,因为系统不知道是否截取到完整的信息。

增加区分度的方法步骤:

  1. 算出这个列上有多少个不同的值

select count(distinct email) as L from User;
  1. 依次选取不同长度的前缀来看这个值


mysql> 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 User;
  1. 设定一个损失比例:比如L*90%

第三种:倒序存储,再String字段创建前缀索引

存储身份证信息的时候可以倒过来存,再给该字段建立前缀索引。但是数据读与写的时候,都需要执行一次reverse()函数;优点:可以绕过字符串本身前缀的区分度不够的情况 缺点:但是不适用于范围查询

reverse():sql函数,作用是将字符串反序

第四种:给String字段创建 hash 字段索引

创建一个整数字段用来保存string字段的校验码,同时给该字段添加索引。每次插入新记录的时候,都要用 crc32() 这个函数得到校验码填到这个新字段中。优点:查询性能稳定 缺点:不支持范围查询,有额外的计算、存储消耗

crc32():用于计算循环冗余值,使用这个函数得到的结果有可能相同

unsigned: 既为非负数,用此类型可以增加数据长度

建立索引
alter table t add str_crc int unsigned, add index(str_crc);
查询语句
select field from t where id_card_crc=crc32('stringxxx') and str_crc='stringxxx'

你可能感兴趣的:(学习总结,sql,数据库)