SQL函数导致索引失效,因破坏“索引列原始值可直接比对”前提;如UPPER(name)、YEAR(create_time)等作用于WHERE左侧时,数据库无法利用原索引,需改写为SARGable形式或用生成列、函数索引等方案。

SQL函数影响索引,本质是破坏了“索引列的原始值可直接比对”这一前提。数据库只能高效走索引,当它看到 WHERE UPPER(name) = 'ALICE' 或 WHERE YEAR(create_time) = 2023 这类写法时,无法用已建的 name 或 create_time 索引做快速定位——因为索引里存的是原始 name 值和 create_time 时间戳,不是它们的函数结果。
哪些函数操作会让索引失效
只要出现在 WHERE 子句左侧(即被作用于索引列)的函数或表达式,基本都会导致索引跳过:
-
字符串函数:如
UPPER()、LOWER()、SUBSTRING()、TRIM()—— 例如WHERE SUBSTRING(phone, 1, 3) = '138' -
日期函数:如
YEAR()、MONTH()、DATE()、DAYOFYEAR()—— 例如WHERE DATE(order_time) = '2025-12-18' -
数学运算:如
col * 2 > 100、col + 1 = 5—— 左侧不是纯列名 -
隐式类型转换:如字段是
VARCHAR,但查询写成WHERE phone = 13812345678(数字没加引号),MySQL 可能触发全表扫描
改写思路:让条件“SARGable”(可搜索参数化)
核心原则是:把函数从索引列上“移开”,改到常量侧或用等价范围表达。
标签: mysql ai 隐式类型转换 为什么 red 2025
还木有评论哦,快来抢沙发吧~