美文网首页MySQL
61-MySQL索引优化与查询优化-字符串前缀索引

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

作者: 紫荆秋雪_文 | 来源:发表于2022-11-04 13:21 被阅读0次

    一、准备数据

    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.png

    2.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’时,循环结束

    相关文章

      网友评论

        本文标题:61-MySQL索引优化与查询优化-字符串前缀索引

        本文链接:https://www.haomeiwen.com/subject/naretdtx.html