MySQL 索引的最左匹配原则是指在使用联合索引的过程中,查询条件必须从索引的最左侧开始匹配。如果联合索引包含多个列,查询条件必须包含第一个列,然后是第二个列,以此类推。
底层原理:联合索局部有序。比如建立联合索引 (a,b),b只在a为确定值时有序,在全局则乱序。
示例
为 (a,b,c) 建立联合索引
等值查找
以下符合联合索引
sql
where a = 1
where a = 1 and b = 1
where a =1 and b = 1 and c = 1
以下不符合联合索引
sql
where b = 1
where c = 1
where b =1 and c = 1
以下可能符合联合索引
sql
where a = 1 and c =1
在5.6版本之前,只有 a = 1 这个条件可以用上索引。在 5.6 版本后有个优化,即索引下推,可以在引擎层面查询 a = 1 的数据后判断 c = 1,将筛选后的结果再返回到 server 层
范围查找
如果遇到范围查找 ( < , > ) 就会停止匹配
sql
where a > 1 and b = 1 and c = 1
上面 a > 1 可以用到联合索引,b 和 c 无法用到,因为在 a > 1 的整体上 b 和 c 是无序的
如果遇到如 >=、<=、BETWEEN、前缀like(xx%)的范围查询,则不会停止匹配。
sql
where a >= 1 and b = 1 and c = 1
以上查询等价于下面两条总和
sql
where a = 1 and b = 1 and c = 1
where a > 1 and b = 1 and c = 1
在 a = 1 时,b,c 可以用到联合索引,在 a > 1 时 b,c无法用到联合索引