1. mysql支持前缀索引,可以定义字符串一部分作为索引
      1. alert table user add index index1(email) - 给email整个字段加索引
        1. image.png
      2. alert table user add index index2(email(6)) - 给email前6个字节加索引<前缀索引>
        1. image.png
      3. 虽然前缀索引占用的空间会更小,但是带来的损失就是会增加额外的记录扫描次数。
    2. select id,name,email from user where email = ‘zhangsan@163.com’;
      1. 如果使用的全字段索引,执行顺序为:
        1. 从index1索引树上找到满足索引值为zhangsan@163.com的这条记录,取得对应id的值。
        2. 到主键上查到主键值为对应id的行,判断email的值是正确的,将这行记录加入结果集中。
        3. 取index1索引数上刚刚查到位置的下一条记录,发现不满足 email = ‘zhangsan@163.com’的条件了,循环结束。
        4. 整个过程,只需要回主键索引取一次数据,所以系统认为只扫描了一行。
      2. 如果使用的是前缀索引,执行顺序为:
        1. 从index2索引树上找到满足索引值为’zhangs’的记录,找到的第一个是ID1
        2. 到主键上查到的主键值是ID1的行,判断出email的值不是’zhangsan@163.com’,这行记录丢弃。
        3. 去index2上刚刚查到的位置的下一条记录,发现仍然是’zhangs’,取出ID2,再到主键索引上取整行然后判断,这次值对了,将这行记录加入结果集。
        4. 重复上一步,知道index2上取到的值不是’zhangs’时,循环结束。
        5. 整个过程,要回主键索引取4次数据,也就是扫描了4行。
      3. 使用前缀索引后,可能会导致查询语句读数据的次数变多。
    3. 字符串字段创建索引的场景:
      1. 直接创建完整索引,这样可能比较占用空间
      2. 创建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引。
      3. 倒叙存储,再创建前缀索引,用于绕过字符串本身前缀的区分度不够的问题。
      4. 创建hash字段索引,查询性能稳定,有额外的存储和计算消耗,跟第三种方式一样,都不支持范围查询。