什么情况下索引会失效?即查询不走索引?
在一些特定的情况下,即使表上存在索引,索引也可能不生效,不能被查询优化器使用。以下是一些常见的情况:
- 使用!=或<>操作符:索引对期待扫描全部数据的查询通常没有帮助,尤其是不等式查询。
- 对索引列进行计算或函数操作:如果对一个索引列进行函数操作,那么引擎将无法使用索引,因为它必须对每个行执行函数操作后才能比较结果。例如:
SELECT * FROM table WHERE YEAR(date_column) = 2022;
- 使用LIKE操作符以%开头的模糊查询:当LIKE的模式值以通配符%开头时,无法使用索引,因为查询引擎无法知道搜索结果在何处开始或结束。例如:
SELECT * FROM table WHERE column LIKE '%Z';
- 联合索引中使用最左前缀原则。像
(col1, col2, col3)
这样的联合索引只有在查询条件在索引树左侧时才能够被用到。比如查询col1
或col1, col2
,索引是起效的。但当查询col2
或者col3
或者col2, col3
这样,该索引就不起作用了。 - 数据类型不一致:如果查询中的数据类型与索引中的数据类型不一致,MySQL将无法使用索引。