当前位置: 首页 > 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.gsyq.cn/news/1535275.html

相关文章:

  • 2026年口碑绝佳的菌子火锅排名出炉,快来看看谁是你的心头好! - 博客万
  • HarmonyOS6 实战:3D卡片翻转与多面体动画——ArkUI的rotate深度玩法
  • HumanoidKick足球冠军级人形机器人 全套源码+标准客观参数(801-1100项)
  • 终极指南:为什么NanaZip是现代Windows用户必备的文件压缩工具
  • frictionless-py与大数据:如何在低内存消耗下处理海量表格数据
  • Windows 11 LTSC 24H2 一键恢复微软商店:5分钟完整解决方案
  • C语言终极解密:从 .c 到 .exe 的底层涅槃与预处理魔法
  • 淘金币自动化革命:3分钟释放25分钟,效率提升800%的时间管理新哲学
  • 如何让10块钱的鼠标在macOS上比苹果触控板还好用?
  • 2026宁波市家用空调-中央空调等维修安装移机加氟-本地精选指南 -欧米到家 - 欧米到家
  • 免费本地视频去水印软件推荐:2026实测手机离线APP与电脑开源工具
  • 还在为每个弹窗写 CustomDialog?鸿蒙通用弹窗组件 HappyDialog 从想法到落地
  • 跨平台多店铺库存管控实战:基于AI Agent与MCP协议的非侵入式架构演进
  • 2026上新:成都金牛区除甲醛公司 5 大排名|基于全民票选与真实口碑|高温高湿气候适配性专项测评 - 专注室内空气检测治理
  • 食宿交通专项实测|2026内蒙出行吃住行全测评,瀚辰导游专属食宿车队零踩坑 - 纯玩旅游推荐官
  • 3分钟解决iPhone连接Windows问题:苹果设备驱动终极安装指南
  • pandas生产级聚合:多维异构计算与业务导向窗口分析
  • 5步终极指南:用OpenCore Legacy Patcher让老款Mac焕发新生
  • 2026 上海音改价值深研:不止于当下性价比 —— 魔都之声入门套餐领跑的底层逻辑,是全周期的用户价值 - 汽车音响改装
  • 六大基础电路元件
  • [开源] Memory Checker:极致轻量的 Windows 托盘内存监测工具,告别内存焦虑
  • 魔兽争霸3终极优化解决方案:5分钟实现高帧率与宽屏完美适配
  • PLC上位机开发实战:通信协议、C#实现与工业监控系统构建
  • GIS工程师的机器学习实战:三个月掌握空间智能工作流
  • SCMP培训学什么——供应商全生命周期管理从寻源到淘汰六阶段实战 - 众智商学院课程中心
  • 2026年沈阳建筑器材租赁简析:脚手架/钢管/围挡/钢支撑/跳板/吊篮/钢管扣件/、沈阳高新区华洁钢支撑租赁站一站式配齐各类施工配套器材 - 海棠依旧大
  • 深圳值得推荐的设计奖代理机构 - 博客万
  • 流量监管与流量整形技术详解
  • 软考全攻略:从科目选择到实战技巧,助你高效备考与职业进阶
  • 2026年北京场地电动车出租公司行业解析:电动老爷车、高尔夫球车、电动巡逻车、电动摆渡车、一站式电动观光车辆租赁、售卖及维保服务参考 - 海棠依旧大