MySQL字符串加索引

我们在创建MySQL的字符串索引时,用的最多的就是对所有字符创建索引。但是往往我们忽略的是,字符串可以创建左前缀的索引,这样更短的字符索引可以减少索引的维护成本,下面详细介绍一下。

Demo

比如我们通过邮箱去检索用户的信息,就可能会执行如下的SQL 查询。

mysql>select a, b from user where email = 'xxx@qq.com';

当程序代码中出现上述的查询时,往往我们会对 email 字段创建索引,并且创建索引的语句通常如下所示:

mysql> alter table user add index idx_email(email);

上面的方式是我们最常见的做法,那么我们是否使用过如下方式呢?

mysql> alter table user add index idx_email(email(6));

详解

对于上述Demo 中不同的创建索引的方式,下面图解说明一下:



从上面的图解可以看出,使用 email(6) 可以减少不少的索引开销。那么下面我们分析一下各自的优缺点。

1、回表的次数:使用 email 的索引可以精准的定位到复合条件的记录ID,然后回表去获取数据;但是 email(6) 则是首先获取到可能符合条件的记录ID 然后回表去判断,此时如果前缀的区分度不大,则可能造成多次的回表操作,反而降低了性能。

2、覆盖索引:使用 email 的索引可能会使用到覆盖索引,也就是可能不用回表就可以返回结果了。比如执行 select id, email from user where email = 'xxx',此时就不需要回表操作了;而对于 email(6) 则是肯定需要回表的。

总结以上,创建索引则是需要考虑索引长度,同时也需要兼顾索引的区分度


参考:《极客时间:MySQL实战》、《高性能MySQL》