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 > 30、WHERE 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 ...中type为ALL或index,且key为空,大概率存在隐式转换 - ✅ 统一类型:字符串字段就用引号,
WHERE user_id = '123';数字字段别存成字符串 - ⚠️ MySQL 特别敏感:
WHERE status = '1'对TINYINT字段可能走索引,但WHERE status = 1对VARCHAR字段必然不走——因为优化器把列转成了数字,破坏了索引有序性
联合索引未遵循最左前缀原则
联合索引 (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 木马清除方法
如何在阿里云域名上完成建站全流程?
如何打造高效商业网站?建站目的决定转化率
如何在腾讯云服务器上快速搭建个人网站?


