mysql

86 阅读1分钟

联合索引

最左前缀原则

比如建了一个联合索引(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)

image.png

联合索引的最左匹配原则,在遇到范围查询(如 >、<)的时候,就会停止匹配,也就是范围查询的字段可以用到联合索引,但是在范围查询字段的后面的字段无法用到联合索引。注意,对于 >=、<=、BETWEEN、like 前缀匹配的范围查询,并不会停止匹配,前面我也用了四个例子说明了

索引下推

using index condition 什么时候需要创建索引?

字段有有唯一性 经常在where里的字段 在group by 和order by 里的字段

什么时候不需要建立索引?

  1. 不在where里的
  2. 字段区分度太低,如 gender
  3. 表数据太少
  4. 经常更新的字段,比如账户余额

覆盖索引

回表

为什么主键最好是自增的? 页分裂 页分裂导致不够紧凑,产生大量的内存碎片,从而影响查询效率

索引失效的情况

  1. like %开头
  2. or 有的列不带索引
  3. 在查询条件中有类型转换,函数,计算
  4. 联合索引没有用上 最左匹配