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"
,那么就会去查联合索引树的叶子集,不用回表去查聚簇索引 - 覆盖索引?
- 即使 (a,b,c) 只匹配到 b,但是 b 如果有在查询字段中,比如
- 主键 or
unique
二级索引有类型转换(比如 string 字段用 number 查询)
- 待查找的字段刚好在联合索引树的叶子中
index 是遍历二级索引树的叶子节点的方式,性能差一点
all
直接扫描聚簇索引的叶子节点,坑
索引设计
- 用到索引的字段,要让它从聚簇索引中回表返回的内容尽可能少
- 一般是用到索引的地方,是从他的索引树找到数据,然后从聚簇索引中回表返回的内容再进行其他操作
- 如果是用到了多个索引
- 一般是从首个索引进行回表,然后依次用剩余的索引进行过滤
- 可能是会同时查多个索引树取个交集,再从聚簇索引进行回表