> 总结MySQL索引失效的常见场景:对索引列计算、违反最左原则、LIKE以%开头、OR连接非索引列等,并介绍如何用诊断。 这是一个非常经典且重要的 MySQL 面试和实战问题。 首先要明确一个核心概念:索引失效并非指索引本身坏了或消失了,而是指 MySQL 的优化器(Optimizer)在执行某条 SQL 语句时,经过评估后认为使用索引的成本(Cost)比全表扫描更高,或者根本无法使用索引,于是放弃使用索引,转而执行全表扫描。 下面我将详细列举导致 MySQL 索引失效的各种常见情况,并附上示例和解释。 1. 对索引列进行计算、函数操作或类型转换(最常见) 这是导致索引失效最主要的原因。因为索引保存的是原始列的值,如果对列进行了任何操作,索引中的值就无法直接匹配了,MySQL 无法“反向推算”出索引值。 原理: B-Tree 索引的查找效率依赖于其有序性。对索引列进行函数操作或计算,会破坏这种有序性,使得无法通过 B-Tree 快速定位数据。 示例: 假设 表在 列上有索引。 使用函数: 进行计算: 隐式类型转换: 假设 字段是 类型并建有索引。 2. 违反最左前缀原则(针对联...