SQL 中索引失效的 15 种高频场景及对应优化写法

发布时间 - 2026-01-30 00:00:00    点击率:
索引失效的五大主因:①对索引列使用函数或表达式;②LIKE以%开头;③隐式类型转换;④联合索引未遵循最左前缀原则;⑤统计信息陈旧、选择性差或返回行数过多。

WHERE 子句中对索引列使用函数或表达式

只要在 WHERE 条件里对索引列做了计算、类型转换或调用函数,MySQL/PostgreSQL 等主流引擎基本都会放弃走索引。比如 WHERE YEAR(create_time) = 2025,即使 create_time 有索引,也会全表扫描。

  • ✅ 正确写法:改用范围查询,WHERE create_time >= '2025-01-01' AND create_time
  • ✅ 或建函数索引(MySQL 8.0+ / PG):CREATE INDEX idx_year ON t1 (YEAR(create_time)),但注意这仅对特定函数有效
  • ⚠️ 常见陷阱:WHERE UPPER(name) = 'ABC'WHERE age + 1 > 30WHERE DATE(update_time) = '2025-01-01' 全部失效

LIKE 查询以通配符 % 开头

LIKE 的左侧带 %(如 LIKE '%abc')会导致索引无法做最左前缀匹配,只能回表或全扫。只有 LIKE 'abc%' 才可能命中 B+ 树的有序结构。

  • ✅ 优化方向一:前置固定字符,LIKE 'abc%' 可走索引;若业务允许,把模糊逻辑后置(如搜索“张”姓用户,用 LIKE '张%'
  • ✅ 优化方向二:用全文索引(FULLTEXT)或外部搜索引擎(Elasticsearch)处理前后模糊场景
  • ⚠️ 注意:LIKE '_abc'(下划线单字符)同样不走索引;COLLATE 不匹配时(如字段是 utf8mb4_0900_as_cs,查询却用默认校对),也可能导致索引跳过

隐式类型转换导致索引失效

当 WHERE 条件中索引列与传入值类型不一致,数据库会自动转换——但转换动作常施加在索引列上,使其无法使用索引。典型如字符串字段存数字(user_id VARCHAR(32)),却写成 WHERE user_id = 123

  • ✅ 查看执行计划确认:EXPLAIN SELECT ...typeALLindex,且 key 为空,大概率存在隐式转换
  • ✅ 统一类型:字符串字段就用引号,WHERE user_id = '123';数字字段别存成字符串
  • ⚠️ MySQL 特别敏感:WHERE status = '1'TINYINT 字段可能走索引,但 WHERE status = 1VARCHAR 字段必然不走——因为优化器把列转成了数字,破坏了索引有序性

联合索引未遵循最左前缀原则

联合索引 (a, b, c) 本质是先按 a 排序,a 相同再按 b,以此类推。跳过最左列(如只查 b = ?c = ?)就无法定位数据块起始位置。

  • ✅ 能用上的条件组合:a = ?a = ? AND b = ?a = ? AND b = ? AND c = ?a = ? AND b IN (?, ?)c 可范围)、a BETWEEN ? AND ? AND b = ?
  • ✅ 部分可用:a = ? AND c = ? —— c 不走索引,但 a 还能过滤;而 b = ? AND c = ? 完全失效
  • ⚠️ 注意:ORDER BY 也受此约束。若要 ORDER BY b, c 走索引,必须带上 WHERE a = ?,否则排序仍需 filesort
索引失效不是黑箱,本质是优化器判断「走索引比全扫更贵」。真正容易被忽略的是统计信息陈旧(ANALYZE TABLE 没跑)、索引选择性差(如 gender 只有男/女)、或者查询返回大量行(超过约 20% 行数时,MySQL 倾向直接全表扫描)。这些不会报错,但会让前面所有优化白费。


# mysql  # ai  # 搜索引擎  # 隐式类型转换  # 隐式转换  # sql  # select  # date  # 字符串  # 值类型  # 类型转换  # table  # elasticsearch  # postgresql  # 数据库  # 不走  # 隐式  # 统计信息  # 跳过  # 的是  # 行数  # 子句  # 也会  # 还能  # 下划线 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Java垃圾回收器的方法和原理总结  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程  深圳网站制作的公司有哪些,dido官方网站?  企业网站制作这些问题要关注  公司门户网站制作流程,华为官网怎么做?  iOS正则表达式验证手机号、邮箱、身份证号等  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  详解jQuery停止动画——stop()方法的使用  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何快速查询域名建站关键信息?  怎样使用JSON进行数据交换_它有什么限制  如何在云虚拟主机上快速搭建个人网站?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  如何获取免费开源的自助建站系统源码?  高端网站建设与定制开发一站式解决方案 中企动力  如何在万网ECS上快速搭建专属网站?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  javascript基于原型链的继承及call和apply函数用法分析  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  EditPlus 正则表达式 实战(3)  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  制作电商网页,电商供应链怎么做?  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  利用JavaScript实现拖拽改变元素大小  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  个人摄影网站制作流程,摄影爱好者都去什么网站?  php结合redis实现高并发下的抢购、秒杀功能的实例  如何快速上传自定义模板至建站之星?  iOS中将个别页面强制横屏其他页面竖屏  零服务器AI建站解决方案:快速部署与云端平台低成本实践  焦点电影公司作品,电影焦点结局是什么?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  如何快速生成ASP一键建站模板并优化安全性?  Laravel Blade模板引擎语法_Laravel Blade布局继承用法  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  韩国服务器如何优化跨境访问实现高效连接?  linux top下的 minerd 木马清除方法  如何在阿里云域名上完成建站全流程?  如何打造高效商业网站?建站目的决定转化率  如何在腾讯云服务器上快速搭建个人网站?