字符串应该如何创建索引?


场景一,根据邮箱登录是一个普遍场景,如果邮箱不加索引则需要全表扫描,而如果加入全量索引则需要占用很大的空间。由于字符串索引支持最左前缀原则,则我们可以这样创建索引:

alter table user add index index(email(5));


这里设置email的最左前5个字符作为索引可以缩小范围,但是如果前5个字符可能重复的数据很多,比如 zhangsan@XX.comzhangsi@XX.comzhangwu@XX.comzhangliu@XX.comzhangqi@XX.com都会搜索出来在遍历,区别度太小,在某字段简历索引的一个原则就是这个字段的区别度,如此建立索引区别度太小。所以应该取得区别度可接受的最左前缀。
select count(distinct email) as L from user;(查询总数)

然后执行下列语句,来看每个前缀长度索引的区别度,找一个能够接受的长度,比如你的要求是区别度大于95%,那么可以算一下多长的前缀符合你的要求,区别度=L(n)/L。
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.因为身份证前面都是省市生日等重复较多的信息,所以这里可以考虑倒序存储,并选择一个长度,比如倒数8位作为前缀索引。
select field_list from t where id_card = reverse('input_id_card_string');

2.第二种是用hash,在创建一个身份证hash字段,用这个字段作为索引。
  alter table t add id_card_crc int unsigned, add index(id_card_crc);
查询时候用以下语句:

select field_list from t where id_card_crc=crc32('input_id_card_string') and id_card='input_id_card_string');




免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM