给字符串来个索引
在了解到索引的重要性,以及如何建立一个高效的索引后,就可以面对一些实际的需求进行操作,如何对常见的邮箱字段建立索引。
邮箱常作为登录时的字段,在用户登录的时候,往往需要对邮箱所在的表进行检索。如果没有针对邮箱字段建立索引的话,那么就只能进行全表扫描了,这种情况下,效率是十分的低的。
同时,邮箱作为一个字符串,可以利用 MySQL 的前缀原则,可以将邮箱的一部分定义为索引。
例如:
1 |
|
使用字符串前缀索引的优劣
使用了前缀索引之后,可以节省空间,但是如果长度选取不够合理的时候,会增加读取数据的次数。
在前缀的长度选取不合理的情况下,M 个记录的前 N 个字段是完全相同的,这时,数据库需要在索引树上进行 M 次判断后才能选取到正确的结果集。
因此在对字符串建立前缀索引时,选取的前 N 个字符需要具有区分度。这样的话才能既节省空间,也不会让查询成本上升。
前缀索引的其他使用方式
如果字符串具有区分度的前 N 个字符的 N 值太大,可以利用别的方法建立索引。
一是倒序存储,将需要建立索引的字符串进行倒序后存储,从倒序的字符串中选取具有区分度的前 N 个字符建立索引,然后在查询的时候使用 reverse 函数。
1 |
|
二是利用 hash ,在表中新建一个字段,存储字符串的校验码。在存储时调用 hash 函数生成校验码存入数据库中。这种方法会增加额外的存储消耗。
这两个方法生成的索引都无法支持范围查询。
最后,使用了前缀索引后会影响到覆盖索引,无法再获得覆盖索引所带来的优化。
给字符串来个索引
https://blog.zhangliangliang.cc/post/index-on-string.html