组合索引(复合索引)在以下情况下可能会失效:
不遵循最左前缀原则
WHERE B=1 AND C=2
无法使用该组合索引使用了范围查询后的列
WHERE A=1 AND B>2 AND C=3
- 只有A和B能使用索引,C无法使用使用了函数或表达式
WHERE UPPER(A)='VALUE'
或 WHERE A+1=5
使用了不等于(!=或<>)或NOT IN
WHERE A!=1
通常无法使用索引使用了OR条件
WHERE A=1 OR B=2
除非A和B都有独立索引数据类型不匹配
WHERE A=123
(A是VARCHAR)覆盖索引失效
SELECT *
需要所有列数据,迫使MySQL回表查询优化器选择全表扫描
索引列排序问题
SELECT *
可能导致排序不使用索引**避免使用SELECT ***
合理设计组合索引
使用EXPLAIN分析
EXPLAIN SELECT...
查看索引使用情况考虑索引合并
UNION
替代使用FORCE INDEX提示
-- 组合索引(A,B,C)
-- 有效使用索引
SELECT A, B FROM table WHERE A=1 AND B=2; -- 覆盖索引
-- 索引部分有效
SELECT * FROM table WHERE A=1 AND B>2; -- 只用到A和B
-- 索引失效
SELECT * FROM table WHERE B=2; -- 不满足最左前缀
SELECT * FROM table WHERE A=1 OR C=3; -- OR条件
通过合理设计索引和查询语句,可以显著提高MySQL查询性能。