当进行多字段查询时,索引可能会失效的主要原因包括:
LIKE '%abc'
-- 好的联合索引设计
CREATE INDEX idx_name_age ON users(last_name, first_name, age);
-- 查询能使用索引的情况
SELECT * FROM users WHERE last_name = 'Smith' AND first_name = 'John';
SELECT * FROM users WHERE last_name = 'Smith';
-- 不好的写法(索引失效)
SELECT * FROM users WHERE YEAR(create_time) = 2023;
-- 好的写法(能使用索引)
SELECT * FROM users WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';
-- 范围查询后索引失效
SELECT * FROM users WHERE age > 30 AND last_name = 'Smith';
-- 解决方案1: 调整索引顺序(如果业务允许)
CREATE INDEX idx_lastname_age ON users(last_name, age);
-- 解决方案2: 使用索引合并
SELECT * FROM users WHERE last_name = 'Smith' AND age > 30;
-- 强制使用特定索引
SELECT * FROM users FORCE INDEX(idx_name_age) WHERE first_name = 'John' AND age > 25;
-- 只查询索引包含的列,避免回表
SELECT last_name, first_name FROM users WHERE last_name = 'Smith';
-- 不好的写法(除非name和age都有独立索引)
SELECT * FROM users WHERE name = 'John' OR age = 30;
-- 好的写法
SELECT * FROM users WHERE name = 'John'
UNION
SELECT * FROM users WHERE age = 30;
-- 查看查询执行计划
EXPLAIN SELECT * FROM users WHERE last_name = 'Smith' AND age > 30;
-- 查看索引使用情况
SHOW INDEX FROM users;
-- 开启优化器跟踪(MySQL 5.6+)
SET optimizer_trace="enabled=on";
SELECT * FROM users WHERE ...;
SELECT * FROM information_schema.optimizer_trace;
SET optimizer_trace="enabled=off";
通过合理设计索引、编写优化查询语句和使用适当的查询技术,可以显著提高多字段查询的性能并避免索引失效问题。