index

  • const
    • 主键
    • unique 二级索引
    • 是包含多个列的 unique 二级索引的话,比如最左侧列完全是等值比较才是 const,否则是 ref
  • ref

    • 普通二级索引
    • 主键 or unique 二级索引使用了 is null

    • 是包含多个列的普通索引的话,需要满足最左侧列大多连续是等值比较原则,即有用到这个普通索引

      • 右侧使用了范围也没关系
  • ref_or_null
    • 普通二级索引使用了 is null
  • range
    • 索引用到范围查询

const、ref和range,本质都是基于索引树的二分查找和多层跳转来查询,性能高

  • index
    • 待查找的字段刚好在联合索引树的叶子中
      • 即使 (a,b,c) 只匹配到 b,但是 b 如果有在查询字段中,比如 select b from t where b = "x" ,那么就会去查联合索引树的叶子集,不用回表去查聚簇索引
      • 覆盖索引?
    • 主键 or unique 二级索引有类型转换(比如 string 字段用 number 查询)

index 是遍历二级索引树的叶子节点的方式,性能差一点

  • all

直接扫描聚簇索引的叶子节点,坑

索引设计

  • 用到索引的字段,要让它从聚簇索引中回表返回的内容尽可能少
  • 一般是用到索引的地方,是从他的索引树找到数据,然后从聚簇索引中回表返回的内容再进行其他操作
  • 如果是用到了多个索引
    • 一般是从首个索引进行回表,然后依次用剩余的索引进行过滤
    • 可能是会同时查多个索引树取个交集,再从聚簇索引进行回表