先上口号:
之前有看过尚硅谷的视频资料,感觉口号挺好的,便于记忆
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
Like百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用;
VAR引号不可丢,SQL高级也不难!
以下是一些可能导致 MySQL 索引失效的情况:
- 对索引列进行函数操作
- 例如:
SELECT * FROM table WHERE YEAR(date_column) = 2024;
,对date_column
进行了函数YEAR()
操作,可能导致索引失效。
- 例如:
- 对索引列进行表达式计算
- 比如:
SELECT * FROM table WHERE column1 + column2 = 10;
,对索引列进行了加法运算。
- 比如:
- 在索引列上使用
LIKE
操作,以%
开头- 像
SELECT * FROM table WHERE column LIKE '%value%';
会导致索引失效,但SELECT * FROM table WHERE column LIKE 'value%';
可以使用索引。
- 像
- 在索引列上使用
OR
连接条件,且OR
连接的多个条件中不是每个都使用了索引- 例如:
SELECT * FROM table WHERE column1 = 1 OR column2 = 2
,如果column1
有索引但column2
没有,可能导致索引失效。
- 例如:
- 数据类型不一致
- 比如索引列是整数类型,但查询条件中提供的是字符串类型的值。
- 索引列上使用
IS NULL
或IS NOT NULL
,但该列允许NULL
值且存在大量NULL
值- 这可能导致优化器选择全表扫描而不是使用索引。
- 全表扫描成本更低时
- 如果表中的数据量很小,或者通过索引进行查询的成本高于全表扫描,优化器可能选择全表扫描而不使用索引。
- 违反最左前缀原则
- 对于多列索引(组合索引),如果查询条件没有从最左边的列开始,可能无法使用索引。