mysql如何给字符串字段加索引
现在许多系统支持邮箱登录,给这样的字段设置索引
第一种:给String字段创建完整索引
alter table User add index index(email);这种方式创建的索引,只需要回到主键索引上取一次值,但是比较占用空间
第二种:给String字段创建前缀索引
alter table SUser add index index(email(6));这种方式创建索引,比如查询email=“zhangsaigxxx.@qq.com”,根据email(6)从 index索引树找到满足索引值是’zhangs’的记录获得ID值,再到主键索引上取到email,比较email值是否等于zhangsaigxxx.@qq.com,不相等就会再重复以上操作直到没有满足索引值。可以发现使用前缀索引会多次查询读数据会变多。
注意点:占用空间会少,使用前缀所以用不上覆盖索引对查询性能的优化,因为系统不知道是否截取到完整的信息。
增加区分度的方法步骤:
算出这个列上有多少个不同的值
select count(distinct email) as L from User;依次选取不同长度的前缀来看这个值
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;设定一个损失比例:比如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'
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)