61-MySQL索引优化与查询优化-字符串前缀索引

一、准备数据

CREATE TABLE teacher
(
    id    BIGINT UNSIGNED PRIMARY KEY,
    email VARCHAR(64)
);
  • 使用邮箱查询
DESC
SELECT *
FROM teacher
WHERE email = '[email protected]';
  • 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.png

2.2、使用index1(即email整个字符串的索引结构),执行顺序是这样的

  • 1、从index1索引树找到满足索引值是’ [email protected] ’的这条记录,取得ID2的值
  • 2、到主键上查到主键值是ID2的行,判断email的值是正确的,将这行记录加入结果集
  • 3、取index1索引树上刚刚查到的位置的下一条记录,发现已经不满足email=' [email protected] ’的条件了,循环结束

2.3、如果使用的是index2(即email(6)索引结构),执行顺序是这样的

  • 1、从index2索引树找到满足索引值是’zhangs’的记录,找到的第一个是ID1
  • 2、到主键上查到主键值是ID1的行,判断出email的值不是’ [email protected] ’,这行记录丢弃
  • 3、取index2上刚刚查到的位置的下一条记录,发现仍然是’zhangs’,取出ID2,再到ID索引上取整行然后判断,这次值对了,将这行记录加入结果集
  • 4、 重复上一步,直到在idxe2上取到的值不是’zhangs’时,循环结束

你可能感兴趣的:(61-MySQL索引优化与查询优化-字符串前缀索引)