前缀索引

前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引。

在 email 字段上创建索引的语句:

mysql> alter table SUser add index index1(email);

mysql> alter table SUser add index index2(email(6));

首先,你可以使用下面这个语句,算出这个列上有多少个不同的值:

mysql> select count(distinct email) as L from SUser;

然后,依次选取不同长度的前缀来看这个值,比如我们要看一下 4~7 个字节的前缀索引,可以用这个语句:

mysql> 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 SUser;

当然,使用前缀索引很可能会损失区分度,所以你需要预先设定一个可以接受的损失比例,比如 5%。然后,在返回的 L4~L7 中,找出不小于 L * 95%的值,假设这里 L6、L7 都满足,你就可以选择前缀长度为 6。

覆盖索引

如果使用前缀索引,那么就无法使用覆盖索引。