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;
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!