怎么给字符串字段加索引

创建完整索引,会占用比较多的空间

创建前缀索引

比如需要给用户表的name字段增加索引,取前6字符作为前缀索引,命令是
alter table user add index idx_name name(6);

但千万注意,此时创建的name索引无法和主建id组成覆盖索引,
select name, id from user; 此时必须回表根据id查出记录。

创建前缀索引时,指定多长的字符,推荐以能覆盖95%以上的数量为宜; 可以这样统计:

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

以上的L4~L7中,找出不小于L * 95%的值,比如
6,7 的长度满足覆盖了95%的总数的话,就建立长度为6的前缀索引

倒序存储和建立hash字段

前缀索引需要根据能覆盖的总数来建立,如果前缀字符的区分度不高,需要建立更长的字段,这样建立的前缀索引会占用更多空间。

有两种方式可以解决前缀长度区分度不够的问题

  1. 每次倒序存储,这样反过可以对字符串后几位建立索引,查询时也需要倒过来查询
    select * from user where name = reverse('lisi')
  2. 使用crc32取字符串的hash值,并一并存储,建立索引。
    mysql> alter table t add id_card_crc int unsigned, add index(id_card_crc);
    查询时
    select field_list from t where id_card_crc=crc32("lisi")

倒叙存储和hash字段,由于对字符串进行了操作,因此无法对其使用区间搜索。

另外前缀索引由于无法提供完整的字段信息,就用不了覆盖索引的优化了

原文地址:https://www.cnblogs.com/linyihai/p/15725533.html