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

where id NOT IN(?,?,?) 会走索引吗?

文章目录

      • 1. 优化器不是“法律条文”,而是“精算师”
      • 2. 临界点:到底选哪种?
      • 3. 拆解图中的例子
        • 情况 A:`WHERE num NOT IN (1, 2)`
        • 情况 B:`WHERE num NOT IN (3)`
      • 4. 总结与口诀
      • 💡 进阶思考

这张图解释了 MySQL 优化器的一个核心灵魂:成本准则(Cost-based Optimization)

很多人有个误区,觉得“NOT IN!=LIKE '%xxx'肯定不走索引”。但实际上,MySQL 并不看心情,它只看数学。

为了让你彻底理解,我们要把这个逻辑拆成三层:


1. 优化器不是“法律条文”,而是“精算师”

MySQL 优化器在执行每一条 SQL 前,都会在后台算两笔账:

  • 账本 A(走索引):先去二级索引找 ID,拿到 ID 后再去主键索引找整行数据(这个动作叫“回表”)。
  • 账本 B(全表扫描):直接从头到尾把整张表的数据扫一遍。

重点来了:
二级索引是逻辑有序的,但在磁盘上,回表去拿具体数据时往往是随机 I/O;而全表扫描是顺序 I/O
对于磁盘来说,顺序读比随机读快得多


2. 临界点:到底选哪种?

优化器会估算一个“比例”。

  • 如果你的NOT IN过滤掉绝大部分数据,只剩下1%的数据需要查。
    • 优化器想:“回表只要回 1% 的次数,不麻烦,走索引吧!”
  • 如果你的NOT IN只过滤掉一点点,剩下90%的数据都要查。
    • 优化器想:“我要回表 90% 的行,这得在磁盘上跳来跳去 90 万次,我不如直接花点力气把整张表顺序读一遍呢!”

3. 拆解图中的例子

假设表里有 200 万零几行数据:

  • num = 1:有 100 万行
  • num = 2:有 100 万行
  • num = 3:只有 5 行
情况 A:WHERE num NOT IN (1, 2)
  • 含义:实际上就是找num = 3的那 5 行。
  • 成本:只需要通过索引找到这 5 行,然后回表 5 次。
  • 结果:走索引。因为数据量极小,回表成本几乎为零。
情况 B:WHERE num NOT IN (3)
  • 含义:实际上是找num为 1 和 2 的那 200 万行。
  • 成本:要回表 200 万次!磁头会在磁盘上跳疯掉。
  • 结果:不走索引(全表扫描)。优化器认为顺序读这 200 万行比跳着读更快。

4. 总结与口诀

这个知识点其实在讲“索引的选择性(Selectivity)”

  • 什么时候走索引?当过滤完剩下的数据**“少而精”**的时候。
  • 什么时候全表扫描?当剩下的数据**“多而杂”**(通常超过全表的 20%~30%)的时候。

所以,不要记“NOT IN 不走索引”,要记“剩下的太多就不走索引”。


💡 进阶思考

如果你查询的字段就在索引里(覆盖索引),不需要回表,那么哪怕NOT IN剩下 99% 的数据,它也依然会走索引。因为不需要回表,随机 I/O 的痛点消失了。

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

相关文章:

  • 容器日志总在延迟?VSCode 2026实时查看全链路优化指南,从毫秒级卡顿到亚秒级响应
  • 用STM32CubeMX快速配置SDIO+FATFS,实现SD卡文件系统读写(附工程源码)
  • ZenStatesDebugTool完全指南:掌握AMD Ryzen处理器的终极调试与超频工具
  • 2026现阶段武汉优质无纺布手提包装袋厂商甄选:为何袋言人环保科技有限公司值得关注? - 2026年企业推荐榜
  • 深入解读Simulink SIL仿真的三种模式:顶层模型、Model模块与子系统模块到底怎么选?
  • AI Agent与区块链智能合约的交互:构建可信的自动化执行体系
  • Claude Code漏洞之后,Agent系统的测试边界,开始出现裂缝
  • 潮乎盲盒商城开源源码|支持H5+小程序+APP三端打包|Laravel+UniApp架构
  • 320hz显示器品牌推荐:微星MAG274QPF黑刃凭原生320Hz领跑赛道
  • LiveDraw:终极实时屏幕标注工具完全指南
  • Zotero文献去重插件终极指南:一键清理重复文献
  • 思源黑体TTF字体构建方案:解决多语言排版难题的实战指南
  • 云原生入门系列|第13集:K8s集群部署与卸载,新手也能轻松上手
  • C++26反射元编程成本封顶术:4种编译期剪枝模式+1个编译器补丁级优化,已获ISO WG21非正式采纳
  • 【独家首发】VSCode 2026插件沙箱机制详解(含本地模型量化部署+私有RAG接入秘钥)
  • LeetCode 3464. 正方形上的点之间的最大距离——二分答案 + 环上贪心(超详细图解 + 完整代码)
  • NVIDIA Nemotron全栈技术解析:构建专业级AI代理系统
  • Python 协程任务异常处理机制
  • Arm SVE2指令集:矩阵运算与密码学加速实战解析
  • 项目管理系统选型如何判断是补齐短板还是替换全套工具
  • AI 12小时设计CPU完整解析:从219字到RISC-V内核的技术突破
  • 云原生入门系列|第14集:K8s进阶入门,从基础到生产的过渡技巧
  • 浏览器渲染原理进阶:重排重绘底层机制 + 实战检测 + 终极规避方案(DevTools高阶实战)
  • 【BECKHOFF】【SIEMENS】倍福C9900-M800按钮盒说明、资料、系统卡备份
  • AI大模型大师秘籍:2026年AI技术全景揭秘,从入门到精通
  • Windows虚拟显示器驱动解决方案:基于Rust与WDF/UMDF架构的高性能虚拟显示扩展
  • 分类数据集 - 道路状况检测图像分类数据集下载
  • PHPStudy V8.1 vs 2018版深度对比:选哪个更适合你的Web开发或安全学习?
  • 2026天津复读学校实测优选|提分高口碑稳,辅仁学校重点优先锁定 - 外贸老黄
  • 一体化项目管理工具有哪些?6款热门方案对比与分析