最左匹配原则是指在查询条件中使用了复合索引时,索引可以被用于查找满足查询条件的数据的最左前缀。如果查询中的条件不满足索引的最左前缀,索引将不会被使用,从而导致索引失效。
然而,有以下情况可能不满足最左匹配原则:
-
未使用索引的列:如果查询条件中的列没有包含在复合索引的最左前缀中,那么索引无法被利用。例如,索引列为 (a, b, c),但查询条件只包含了列 b 或列 c,而没有列 a,那么最左匹配原则就不满足。
-
使用函数或运算符:如果查询条件中使用了函数或运算符,索引无法直接匹配到查询条件,因此最左匹配原则无法满足。例如,索引列为 (a, b),但查询条件为 a + b = 10,这种情况下索引无法被利用。
-
列类型不匹配:如果查询条件中的列和索引列的类型不匹配,最左匹配原则可能无法满足。例如,索引列为字符串类型,而查询条件中的列为数字类型,这种情况下索引无法直接匹配查询条件。
-
列存在范围查询:如果查询条件中的列存在范围查询(例如大于、小于、范围区间等),那么最左匹配原则可能无法满足。例如,索引列为 (a, b, c),但查询条件为 a = 1 AND b > 5,这种情况下索引无法直接匹配到范围查询的部分。
【索引下推-------对于联合索引(a, b),在执行 select * from table where a > 1 and b = 2 语句的时候,只有 a 字段能用到索引,那在联合索引的 B+Tree 找到第一个满足条件的主键值(ID 为 2)后,还需要判断其他条件是否满足(看 b 是否等于 2),那是在联合索引里判断?还是回主键索引去判断呢?
在 MySQL 5.6 之前,只能从 ID2 (主键值)开始一个个回表,到「主键索引」上找出数据行,再对比 b 字段值。
而 MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在联合索引遍历过程中,对联合索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
当你的查询语句的执行计划里,出现了 Extra 为 Using index condition,那么说明使用了索引下推的优化。】
【https://xiaolincoding.com/mysql/base/how_select.html#%E6%89%A7%E8%A1%8C%E5%99%A8】
总之,最左匹配原则在使用复合索引进行查询时是一个重要的优化原则,但在某些特定的情况下可能无法满足,导致索引无法被利用。在设计索引和查询时,需要综合考虑数据的结构、查询条件和索引的使用情况,以获得更好的性能。