联合索引
最左前缀原则
比如建了一个联合索引(a,b,c) 以下都用到了索引
where a=4 and b= 2
where a = 3 and c = 2
where b= 4 and a=4 and c = 3
但下面这些用不到索引
where b = 3 and c = 3
范围查询的字段可以用到联合索引,但是在范围查询字段的后面的字段无法用到联合索引 如下图所示,建了一个索引 (age,num)
联合索引的最左匹配原则,在遇到范围查询(如 >、<)的时候,就会停止匹配,也就是范围查询的字段可以用到联合索引,但是在范围查询字段的后面的字段无法用到联合索引。注意,对于 >=、<=、BETWEEN、like 前缀匹配的范围查询,并不会停止匹配,前面我也用了四个例子说明了
索引下推
using index condition 什么时候需要创建索引?
字段有有唯一性 经常在where里的字段 在group by 和order by 里的字段
什么时候不需要建立索引?
- 不在where里的
- 字段区分度太低,如 gender
- 表数据太少
- 经常更新的字段,比如账户余额
覆盖索引
回表
为什么主键最好是自增的? 页分裂 页分裂导致不够紧凑,产生大量的内存碎片,从而影响查询效率
索引失效的情况
- like %开头
- or 有的列不带索引
- 在查询条件中有类型转换,函数,计算
- 联合索引没有用上 最左匹配