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,只是它用了最简单的转换规则:字符串转数字的规则,而刚好我们设定的这个背景,可以保证这个转换后结果的唯一性