当前位置: 首页 > news >正文

索引失效场景

1. 最左前缀原则失效

假设联合索引:

CREATE INDEX idx_abc ON user(name, age, city);

索引顺序:

name → age → city

可以走索引

where name='Tom'
where name='Tom' and age=20
where name='Tom' and age=20 and city='BJ'

不能走索引

where age=20
where city='BJ'
where age=20 and city='BJ'

因为缺少最左列:

name

B+Tree 无法定位起始位置。


2. 索引列使用函数

例如:

where YEAR(create_time)=2025

索引:

create index idx_time on user(create_time);

失效原因:

数据库需要先计算:

YEAR(create_time)

B+Tree 存的是:

2025-06-16 10:00:00

不是:

2025

无法直接利用索引。


优化:

where create_time >= '2025-01-01' and create_time < '2026-01-01'

3. 索引列参与运算

例如:

where age + 1 = 20

索引:

idx_age(age)

失效。

因为:

数据库需要先算 age+1

无法直接使用 B+Tree。


改为:

where age = 19

4. 隐式类型转换

表:

phone varchar(20)

索引:

idx_phone(phone)

查询:

where phone = 13800138000

注意:

phone 是 varchar 条件是数字

MySQL 可能会:

CAST(phone AS SIGNED)

变成:

函数作用于索引列

导致索引失效。


正确写法:

where phone='13800138000'

5. LIKE 左模糊查询

索引:

idx_name(name)

可以走索引

where name like 'Tom%'

因为:

Tom Tom1 Tom2 Tom3

范围明确。


不能走索引

where name like '%Tom'

或者:

where name like '%Tom%'

因为:

前缀未知

B+Tree 无法定位起点。

只能全表扫描。


6. 范围查询后面的列失效

联合索引:

(name, age, city)

查询:

where name='Tom' and age > 20 and city='BJ'

执行到:

age > 20

之后:

city

无法继续利用索引匹配。

原因:

范围查询会破坏索引连续性。


口诀:

范围之后全失效

(这里是指索引匹配能力,不是一定完全不用索引)


7. OR 导致索引失效

例如:

where name='Tom' or salary=10000

如果:

name有索引 salary没索引

MySQL 很可能:

直接全表扫描

因为:

走索引 + 全表扫描

成本可能更高。


优化:

UNION ALL

拆开。


8. 使用 != 或 <>

例如:

where age != 20

或者:

where age <> 20

数据库发现:

大部分数据都满足

需要扫描大量记录。

优化器经常选择:

全表扫描

9. NOT IN

例如:

where id not in (1,2,3)

通常返回:

绝大部分数据

优化器可能放弃索引。


10. NOT EXISTS

类似:

where not exists(...)

很多场景索引利用率较低。


11. 数据量太小

例如:

10条数据

即使有索引:

全表扫描

可能比:

索引查找+回表

更快。

优化器会主动放弃索引。


12. 查询结果占比过高

例如:

where gender='男'

表:

1000万数据

其中:

900万男

即使有索引:

idx_gender

优化器可能认为:

回表900万次

成本太高。

直接:

全表扫描

更划算。


高频总结

MySQL 索引失效常见场景包括:

  1. 不满足联合索引最左前缀原则;
  2. 对索引列使用函数、计算或表达式;
  3. 隐式类型转换;
  4. LIKE 以%开头;
  5. 联合索引中范围查询后的列无法继续利用索引;
  6. OR 一侧无索引;
  7. 使用!=<>NOT INNOT EXISTS
  8. 数据量过小或查询结果占比过高时,优化器主动放弃索引。

本质上,索引失效的原因要么是B+Tree 无法利用有序性定位数据,要么是优化器评估后认为走索引成本高于全表扫描

http://www.jsqmd.com/news/1023411/

相关文章:

  • 2026年口碑绝佳的菌子火锅排名出炉,快来看看谁是你的心头好! - 博客万
  • 小白程序员必看:收藏这份交通大模型(8大领域+116案例)学习指南
  • Mission Planner 3.2 Windows安装深度指南:驱动、.NET、COM口与MAVLink全链路解析
  • 收藏!小白程序员必备:大模型时代黄金三年,5大AI岗位助你逆势起飞!
  • 七台河市_2026年七台河市奢侈品手表包包回收门店权威测评:这五家店铺回收价格最高 - 奢金汇
  • HarmonyOS6 实战:3D卡片翻转与多面体动画——ArkUI的rotate深度玩法
  • HumanoidKick足球冠军级人形机器人 全套源码+标准客观参数(801-1100项)
  • 大模型MoE稀疏激活原理与工程实践全解析
  • 3分钟快速安装:Figma中文汉化插件完整指南
  • ARIMA(p,d,q)参数详解:时间序列建模的可解释性基石
  • 终极指南:为什么NanaZip是现代Windows用户必备的文件压缩工具
  • 资管档案数智化实战:如何利用AI Agent解决RAG知识库与行业制度的同步难题?
  • Windows 11 LTSC 24H2 一键恢复微软商店:5分钟完整解决方案
  • frictionless-py与大数据:如何在低内存消耗下处理海量表格数据
  • 3分钟快速解密:Windows平台NCM格式转换终极方案
  • Spring AI RAG实战:Java企业级知识库问答系统搭建
  • 代码算账偶发一分钱误差?IT留学生快学大厂标准的精准记账法「蒸汽求职分享」
  • 2026南京市家用空调-中央空调等维修安装移机加氟-本地精选指南 -欧米到家 - 欧米到家
  • C语言终极解密:从 .c 到 .exe 的底层涅槃与预处理魔法
  • 2026宁波市家用空调-中央空调等维修安装移机加氟-本地精选指南 -欧米到家 - 欧米到家
  • 如何让10块钱的鼠标在macOS上比苹果触控板还好用?
  • 淘金币自动化革命:3分钟释放25分钟,效率提升800%的时间管理新哲学
  • 2026北京劳力士回收门店TOP5排名正规靠谱机构推荐 - 博客万
  • 跨平台多店铺库存管控实战:基于AI Agent与MCP协议的非侵入式架构演进
  • GR3六轴工业协作机械臂GR3六轴工业协作机械臂技术档案摘要(601-616) 该文档详细介绍了GR3机械臂的核心控制算法和功能模块实现,主要包括: 运动控制:采用自适应终端滑模控制实现高精度轨迹
  • 免费本地视频去水印软件推荐:2026实测手机离线APP与电脑开源工具
  • 倾转旋翼VTOL无人机的高保真6自由度纵向飞行动力学模拟器和闭环GNC堆栈,稳定悬停保持LQR、动态控制混合和固定翼巡航MATLAB 和 Simulink
  • 还在为每个弹窗写 CustomDialog?鸿蒙通用弹窗组件 HappyDialog 从想法到落地
  • 2026上新:成都金牛区除甲醛公司 5 大排名|基于全民票选与真实口碑|高温高湿气候适配性专项测评 - 专注室内空气检测治理
  • Codex Windows桌面接管能力解析:Computer Use技术原理与落地实践