11讲怎么给字符串字段加索引

1 案例: 给邮箱登录字段加索引
2 部分前缀作为索引 add index index2(email(6)); 只取6个字节
3 使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。
4 通过区分度来确定某个字符串字段的长度选取
5 select count(distinct email) as L from SUser; 获取不重复的数量
6 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; 获取前几个字节不重复的数量
7 可以考虑损失百分之95的区分度
8 使用前缀索引则无法用到覆盖索引 , 因为需要回表判断
9 身份证号的案例 , 18位 , 前6位是地址码 , 区分度低 , 可以通过倒序存储 , 因为后面的数字区分度高一些 ,
10 第二种方法是使用hash , 新增一个字段存整数哈希 , 变成了4个字节 , 节省空间
11 都不能进行范围查询
12 对这两种解决方案的对比
它们的区别,主要体现在以下三个方面:

  1. 从占用的额外空间来看,倒序存储方式在主键索引上,不会消耗额外的存储空间,而hash字段方法需要增加一个字段。当然,倒序存储方式使用4个字节的前缀长度应该是不够的,如果再长一点,这个消耗跟额外这个hash字段也差不多抵消了。
  2. 在CPU消耗方面,倒序方式每次写和读的时候,都需要额外调用一次reverse函数,而hash字段的方式需要额外调用一次crc32()函数。如果只从这两个函数的计算复杂度来看的话,reverse函数额外消耗的CPU资源会更小些。
  3. 从查询效率上看,使用hash字段方式的查询性能相对更稳定一些。因为crc32算出来的值虽然有冲突的概率,但是概率非常小,可以认为每次查询的平均扫描行数接近1。而倒序存储方式毕竟还是用的前缀索引的方式,也就是说还是会增加扫描行数。

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

我会采用hash的方式 , 直接将学号字符串存为整数 , 这也是一种最简单的哈希吧

你可能感兴趣的:(11讲怎么给字符串字段加索引)