news 2026/6/9 23:49:07

MySQL扫描 1,000,010 行 → 磁盘 I/O 爆炸的庖丁解牛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL扫描 1,000,010 行 → 磁盘 I/O 爆炸的庖丁解牛

“MySQL 扫描 1,000,010 行 → 磁盘 I/O 爆炸”是深度分页查询的典型性能灾难。其本质是全表扫描 + 随机 I/O + 内存不足的三重叠加效应。


一、执行机制:为什么必须扫描 1,000,010 行?

▶ 1.LIMIT offset, size的执行逻辑
SELECT*FROMordersORDERBYidLIMIT1000000,10;
  • 步骤
    1. id排序(若无索引则 filesort)
    2. 逐行读取前 1,000,010 行
    3. 丢弃前 1,000,000 行
    4. 返回后 10 行

💡核心认知
MySQL 无法“跳过”中间行,必须物理扫描所有前置行

▶ 2.索引的影响
场景扫描方式I/O 类型
无索引全表扫描 + filesort随机 I/O(HDD ≈ 10ms/行)
有主键索引索引扫描顺序 I/O(HDD ≈ 0.1ms/行)

📌关键点
即使有索引,仍需扫描 1,000,010 行(仅避免排序开销)


二、I/O 路径:磁盘如何响应?

▶ 1.Buffer Pool 未命中
  • 流程

    MySQL 请求第 N 行

    Buffer Pool 有缓存?

    发起磁盘 I/O

    HDD 随机寻道 4ms + 旋转延迟 4ms + 传输 0.1ms

    加载 16KB 页到内存

    返回数据

  • 问题
    • 每行可能分布在不同页 →每次 I/O 仅获取 1 行
▶ 2.HDD vs SSD 性能对比
指标HDDSSD
随机读 I/O 延迟8–12ms0.05–0.1ms
1,000,010 行总耗时2.78 小时1.67 分钟

⚠️现实
即使使用 SSD,100 万行扫描仍需分钟级响应


三、量化影响:资源消耗分析

▶ 1.时间成本
  • HDD 场景
    • 1,000,010 行 × 10ms =10,000,100ms ≈ 2.78 小时
  • SSD 场景
    • 1,000,010 行 × 0.1ms =100,001ms ≈ 1.67 分钟
▶ 2.内存与 CPU 开销
  • 内存
    • 排序缓冲区(sort_buffer_size)溢出 → 创建磁盘临时文件
  • CPU
    • 行比较操作(ORDER BY)消耗大量 CPU 周期
▶ 3.系统级影响
  • 锁竞争
    • InnoDB 行锁持有时间过长 → 阻塞其他写操作
  • 连接池耗尽
    • 单个慢查询占用连接 → 新请求被拒绝

四、破局之道:游标分页

▶ 1.原理
-- 记录上一页最后 id=1000000SELECT*FROMordersWHEREid>1000000ORDERBYidLIMIT10;
  • 优势
    • 利用聚簇索引直接定位起始点
    • 仅扫描 10 行(而非 1,000,010 行)
▶ 2.性能对比
指标OFFSET 方案游标方案
扫描行数1,000,01010
HDD 耗时2.78 小时0.1ms
SSD 耗时1.67 分钟0.001ms
▶ 3.实现要点
  • 必须使用自增主键(或唯一索引)
  • 前端传递游标值(如?cursor=1000000
  • 复合排序需加主键兜底
    SELECT*FROMlogsWHERE(created_at,id)>('2023-01-01',1000)ORDERBYcreated_at,idLIMIT10;

五、避坑指南

陷阱破局方案
忽略排序字段唯一性复合排序末尾加主键确保连续
未使用覆盖索引确保WHERE+ORDER BY字段有联合索引
盲目使用 OFFSET深度分页必用游标方案

六、终极心法

**“扫描不是查询,
而是性能的悬崖——

  • 当你使用 OFFSET
    你在支付线性成本;
  • 当你切换游标
    你在享受常数时间;
  • 当你利用索引
    你在消除随机 I/O。

真正的查询优化,
始于对执行计划的敬畏,
成于对细节的精控。”


结语

从今天起:

  1. 深度分页必用游标方案(WHERE id > last_id
  2. EXPLAIN验证执行计划(type=range)
  3. 监控慢查询日志(long_query_time=1

因为最好的分页,
不是跳过百万行,
而是精准定位下一程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 22:58:39

Claude Code:模式修改

Claude Code有三种模式:1.默认模式:修改文件等操作前会征询用户的同意2.规模模式:只讨论,不真正的开始操作3.自动模式:自动操作,不需要每次进行授权三种模式通过shift tab 进行切换

作者头像 李华
网站建设 2026/6/5 0:24:07

你的产品不需要更多AI功能,而是需要AI护栏

简简单单 Online zuozuo :本心、输入输出、结果 文章目录你的产品不需要更多AI功能,而是需要AI护栏前言1、当AI悄悄让产品变差2、有效AI护栏的原则3、关于产品中AI的常见误解4、CTO检查清单:这个功能真的需要AI吗?5、为什么护栏很…

作者头像 李华
网站建设 2026/6/9 21:18:20

实战笔记:西门子1500PLC在汽车焊装线的架构设计

西门子1500PLC博途程序实例,大型程序fanuc机器人汽车焊装自动生产线程序,程序硬件结构包括1台西门子1500PLC程序,2台触摸屏TP1500程序 9个智能远程终端ET200SP Profinet连接 15个Festo智能模块Profinet通讯 10台Fanuc发那科机器人Profinet通讯…

作者头像 李华
网站建设 2026/6/9 22:06:30

自动门(有完整资料)

资料查找方式: 特纳斯电子(电子校园网):搜索下面编号即可 编号: CP-51-2021-058 设计简介: 本设计是基于单片机的自动门系统,主要实现以下功能: 可通过LCD1602显示温度最大值和当…

作者头像 李华
网站建设 2026/6/5 5:15:10

AI写论文新选择!4款AI论文写作工具,让期刊论文创作更简单!

你是否还在为撰写期刊、毕业论文或职称论文而感到困惑?在人工撰写过程中,面对数量庞大的文献,仿佛很难找到所需的资料,加上篇幅、格式等各种要求,使得人们感到无从下手。不断的修改和调整不仅消耗了耐心,写…

作者头像 李华