SQL函数为什么影响索引_查询改写优化思路【教程】

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

SQL函数为什么影响索引_查询改写优化思路【教程】-第1张图片-佛山资讯网

SQL函数影响索引,本质是破坏了“索引列的原始值可直接比对”这一前提。数据库只能高效走索引,当它看到 WHERE UPPER(name) = 'ALICE'WHERE YEAR(create_time) = 2023 这类写法时,无法用已建的 namecreate_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 > 100col + 1 = 5 —— 左侧不是纯列名
  • 隐式类型转换:如字段是 VARCHAR,但查询写成 WHERE phone = 13812345678(数字没加引号),MySQL 可能触发全表扫描

改写思路:让条件“SARGable”(可搜索参数化)

核心原则是:把函数从索引列上“移开”,改到常量侧或用等价范围表达。

标签: mysql ai 隐式类型转换 为什么 red 2025

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~