mysql 索引在哪些情况下会失效

mysql 索引在哪些情况下会失效

  • 在索引列上使用函数或表达式计算
  • 隐式类型转换
  • 在 LIKE 模糊匹配中以 % 开头
  • 在索引列上使用 !=、<>、NOT IN、NOT LIKE
  • 在索引列上使用 IS NULL 或 IS NOT NULL
  • OR 条件中有字段没索引
  • 联合索引不满足最左前缀原则 ⭐
  • 范围查询后,后面的索引列失效 ⭐
  • ORDER BY / GROUP BY 与索引不匹配
  • 字段区分度低 / 表太小

隐式类型转换导致索引失效的常见场景

场景 1:字符串列与数字比较

1
2
-- phone 列是 VARCHAR 类型
SELECT * FROM user WHERE phone = 123456;

MySQL 会把 phone 转成数字再比较。转换过程破坏了索引的有序性,导致索引失效。

正确写法:

1
SELECT * FROM user WHERE phone = '123456';

场景 2:数字列与字符串比较

1
2
-- id 列是 INT 类型
SELECT * FROM user WHERE id = '100';

MySQL 会把 ‘100’ 转成数字再比较。虽然有时优化器仍能用索引,但在某些情况下会放弃索引。

正确写法:

1
SELECT * FROM user WHERE id = 100;
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/71527073
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!