常见索引失效的情况
-
LIKE查询以通配符开头
SELECT * FROM users WHERE name LIKE '%smith';
-
OR语句前后没有同时使用索引
SELECT * FROM users WHERE name = 'John' OR email = 'john@example.com';
-
联合索引未遵循最左前缀原则
-- 假设有一个(name, email)的联合索引 SELECT * FROM users WHERE email = 'john@example.com';
-
索引列数据类型出现隐式转换
SELECT * FROM users WHERE id = '123'; -- id是整型,但查询条件是字符串
-
对索引列进行计算或使用函数
SELECT * FROM users WHERE id * 2 = 246;
-
ORDER BY使用错误
-- 假设name字段没有索引 SELECT * FROM users ORDER BY name;
-
全表扫描速度比索引速度快
-- 假设users表只有很少的记录 SELECT * FROM users WHERE id = 1;
-
WHERE子句中使用参数
-- 假设MySQL版本导致参数化查询时索引失效 PREPARE stmt FROM 'SELECT * FROM users WHERE name = ?'; SET @name = 'John'; EXECUTE stmt USING @name;
-
数据类型不匹配
SELECT * FROM users WHERE name = 123; -- name字段是字符串类型,但查询条件是整型
-
使用is null和is not null时未注意字段是否允许为空
-- 假设name字段不允许为空 SELECT * FROM users WHERE name IS NULL;
-
字符类型字段在查询时未加引号
SELECT * FROM users WHERE name = 123; -- name字段是字符串类型,查询条件未加引号