贝利信息

mysql函数在where条件中如何使用_mysql索引失效说明

日期:2026-01-05 00:00 / 作者:P粉602998670
WHERE中对索引列使用函数必然导致索引失效,因索引基于原始值有序存储,函数改变数据形式使优化器无法匹配;隐式转换同理,应改写条件将函数移至参数侧并用EXPLAIN验证。

WHERE 中用函数会导致索引失效

MySQL 在 WHERE 子句中对索引列使用函数(如 UPPER()DATE()SUBSTRING()YEAR() 等),会直接导致该列上的索引无法被用于范围扫描或等值查找——不是“可能失效”,而是“基本必然失效”。

根本原因:索引是按列原始值的有序结构存储的,而函数改变了数据的表达形式,优化器无法将函数结果与索引 B+ 树中的原始值做快速比对。

哪些写法看似“没用函数”但实际触发隐式转换?

隐式类型转换和字符集转换,效果等同于加了函数,同样破坏索引。

替代方案:重写 WHERE 条件以保留索引能力

核心思路是「把函数从列上挪开,移到参数侧」或「改用可命中索引的等价表达」。

如何快速验证某条 WHERE 是否用了索引?

别猜,用 EXPLAINkeyrows 字段,重点关注:

真正容易被忽略的点是:哪怕只在一个 OR 分支里对索引列用了函数,整个 WHERE 就可能放弃该索引;复合索引中只要左侧字段被函数处理,右侧字段索引能力也一并归零。