MySQL:前缀索引

当字段类型为字符串(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

×

喜欢就点赞,疼爱就打赏