一、准备数据
CREATE TABLE teacher
(
id BIGINT UNSIGNED PRIMARY KEY,
email VARCHAR(64)
);
- 使用邮箱查询
DESC
SELECT *
FROM teacher
WHERE email = 'raven1991@qq.com';
- DESC image.png
- 由于email字段没有索引,只能做
全表扫描
二、前缀索引
MySQL是支持前缀索引的。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串
# 整个字符串添加索引
ALTER TABLE teacher
ADD INDEX index1 (email);
# email字符串前6个字符添加索引
ALTER TABLE teacher
ADD INDEX index2 (email(6));
2.1、这两种不同的定义在数据结构和存储上有什么区别呢?
index1.png index2.png2.2、使用index1
(即email整个字符串的索引结构),执行顺序是这样的
- 1、从
index1
索引树找到满足索引值是’ zhangssxyz@xxx.com ’的这条记录,取得ID2的值 - 2、到主键上查到主键值是ID2的行,判断email的值是正确的,将这行记录加入结果集
- 3、取index1索引树上刚刚查到的位置的下一条记录,发现已经不满足email=' zhangssxyz@xxx.com ’的条件了,循环结束
2.3、如果使用的是index2
(即email(6)索引结构),执行顺序是这样的
- 1、从index2索引树找到满足索引值是’zhangs’的记录,找到的第一个是ID1
- 2、到主键上查到主键值是ID1的行,判断出email的值不是’ zhangssxyz@xxx.com ’,这行记录丢弃
- 3、取index2上刚刚查到的位置的下一条记录,发现仍然是’zhangs’,取出ID2,再到ID索引上取整行然后判断,这次值对了,将这行记录加入结果集
- 4、 重复上一步,直到在idxe2上取到的值不是’zhangs’时,循环结束
网友评论