给字符串来个索引

在了解到索引的重要性,以及如何建立一个高效的索引后,就可以面对一些实际的需求进行操作,如何对常见的邮箱字段建立索引。

邮箱常作为登录时的字段,在用户登录的时候,往往需要对邮箱所在的表进行检索。如果没有针对邮箱字段建立索引的话,那么就只能进行全表扫描了,这种情况下,效率是十分的低的。

同时,邮箱作为一个字符串,可以利用 MySQL 的前缀原则,可以将邮箱的一部分定义为索引。

例如:

1
2
// n 是指定的字符串长度,如果不写,则默认为全部长度。
> alert table t_name add index index_name(email(n));

使用字符串前缀索引的优劣

使用了前缀索引之后,可以节省空间,但是如果长度选取不够合理的时候,会增加读取数据的次数

在前缀的长度选取不合理的情况下,M 个记录的前 N 个字段是完全相同的,这时,数据库需要在索引树上进行 M 次判断后才能选取到正确的结果集。

因此在对字符串建立前缀索引时,选取的前 N 个字符需要具有区分度。这样的话才能既节省空间,也不会让查询成本上升。

前缀索引的其他使用方式

如果字符串具有区分度的前 N 个字符的 N 值太大,可以利用别的方法建立索引。

一是倒序存储,将需要建立索引的字符串进行倒序后存储,从倒序的字符串中选取具有区分度的前 N 个字符建立索引,然后在查询的时候使用 reverse 函数。

1
> select field_name from t_name where index_str = reverse('input_string');

二是利用 hash ,在表中新建一个字段,存储字符串的校验码。在存储时调用 hash 函数生成校验码存入数据库中。这种方法会增加额外的存储消耗。

这两个方法生成的索引都无法支持范围查询

最后,使用了前缀索引后会影响到覆盖索引,无法再获得覆盖索引所带来的优化。


给字符串来个索引
https://blog.zhangliangliang.cc/post/index-on-string.html
作者
Bobby Zhang
发布于
2019年3月18日
许可协议