11 | 怎么给字符串字段加索引?

Page content

11 | 怎么给字符串字段加索引?

给字符串加索引的方式

  • 直接创建完整的索引
  • 前缀索引
  • 倒序存储,再创建前缀索引
  • 使用hash字段

使用前缀索引的优缺点

  • 优点
    • 节省空间
  • 缺点
    • 可能会增加额外的记录扫描数
    • 使用前缀索引导致无法使用覆盖索引(每行都需要回表确认) 使用前缀索引,定义好长度,可以打到既节省空间、又不会增加太多的查询成本。这里可以参考索引的区分度,区分度越高越好
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;

问题讨论

如果你在维护一个学校的学生信息数据库,学生登录名的统一格式是”学号 @gmail.com", 而学号的规则是:十五位的数字,其中前三位是所在城市编号、第四到第六位是学校编号、第七位到第十位是入学年份、最后五位是顺序编号。系统登录的时候都需要学生输入登录名和密码,验证正确后才能继续使用系统。就只考虑登录验证这个行为的话,你会怎么设计这个登录名的索引呢?

答案 只存入学年份加顺序编号,它们的长度是 9 位。而其实在此基础上,可以用数字类型来存这 9 位数字。比如 201100001,这样只需要占 4 个字节。其实这个就是一种 hash,只是它用了最简单的转换规则:字符串转数字的规则,而刚好我们设定的这个背景,可以保证这个转换后结果的唯一性