当字段类型为字符串(varchar,text,longtext等)时,有时候需要索引很长的字符串,这会让索引变得很大,查询时,浪费大量的磁盘IO, 影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节约索引空间,从而提高索引效率。
-- n 表示截取字符串的长度或者说前缀的长度
create index idx_xxxx on table_name(column(n)) ;
create index idx_email_5 on tb_user(email(5));
SHOW INDEX FROM tb_user;

如何确定前缀的长度
可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高, 唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。
选择性 = 不重复的索引值(基数) / 数据表的记录总数
mysql> select count(distinct email) / count(*) from tb_user ;
+----------------------------------+
| count(distinct email) / count(*) |
+----------------------------------+
| 1.0000 |
+----------------------------------+
1 row in set (0.00 sec)
mysql> select count(distinct substring(email,1,5)) / count(*) from tb_user ;
+-------------------------------------------------+
| count(distinct substring(email,1,5)) / count(*) |
+-------------------------------------------------+
| 0.9583 |
+-------------------------------------------------+
1 row in set (0.00 sec)
前缀索引的查询流程

根据email的前5个字符构建一个前缀索引。
在查询时,会截取email的前5个字符去查询非聚簇索引(辅助索引),获取相关主键(id)
接着,根据主键,到聚簇索引里面找到相关数据
取得相关数据之后,不是直接返回,还有再去继续匹配相关email的值,因为查找的时候只是根据前5个字符去查找
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1909773034@qq.com