★
基本概念:
MySql的最左前缀匹配原则是使用联合索引时,查询条件必须从联合索引的最左侧开始匹配,如果一个联合索引包含多列,则查询条件必须包含第一列,然后是第二列,依次类推。
底层原理:
联合索引在B+树中的排列方式遵循从左到右的顺序。例如联合索引(a,b,c),MySql在进行查找时会先匹配a,然后依次是b和c,跳过最左侧的索引将无法使用该联合索引,
例如:联合索引(a,b,c) 正常使用联合索引的情况:where a=1,b=2,c=3
不使用联合索引的情况:where b=2, c=3
使用联合索引的特殊情况:where a=1,c=3,因为这里使用了索引下推
索引下推
索引下推指的是本来该由server层做的操作,下推到存储引擎层过滤,这样做可以减少回表查询,较少I/O次数,提高查询效率
常见场景
where a > 1, b = 2, c = 3 会停止匹配, 所谓的停止匹配指的是:a可以用上联合索引,但是b和c却不行。因为 a 需要先经过范围查询,此时经过筛选得到b 和c的数据是无序的。比如 a 为 1和a为2数据之间b和c是无序的,因此无法利用索引查询。
详细解释:
- 索引结构:假设有一个联合索引INDEX (a, b, c),这意味着索引是按照a、b、c的顺序存储的。
- 范围查询的影响:当查询条件中包含a > 1时,数据库需要查找所有a值大于1的记录。由于a是一个范围查询,它将返回多个可能的a值,这些值对应的b和c值是无序的。
- 索引匹配停止:因为a的值是无序的,索引无法保证b和c的顺序,所以索引在a处“停止”匹配。这意味着,对于b = 2和c = 3的条件,数据库无法直接使用索引来快速定位这些值,因为它们依赖于a的值,而a的值是不确定的。
后果
全表扫描:在这种情况下,数据库可能需要执行全表扫描来找到所有a > 1的记录,然后再检查这些记录是否满足b = 2和c = 3的条件。这会导致查询效率降低,尤其是在大数据量的情况下。
如果遇到如>=、<=、BETWEEN前缀like(xx%)的范围查询,则不会停止匹配。
因为都包含一个等值判断可以定位到某个数 然后往后扫描即可,这些场景不会出现停止匹配的现象
8.0版本之后支持跳跃索引,即使不满足最左前缀匹配原则,也可以走索引