news 2026/5/1 8:48:48

MySQL 无法“跳过”中间行,必须物理扫描所有前置行的庖丁解牛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL 无法“跳过”中间行,必须物理扫描所有前置行的庖丁解牛

“MySQL 无法‘跳过’中间行,必须物理扫描所有前置行”是深度分页(LIMIT offset, size)性能灾难的根本原因。这并非 MySQL 的设计缺陷,而是由其存储引擎架构与 SQL 语义决定的必然结果


一、B+ 树结构:为什么不能“跳过”?

▶ 1.InnoDB 聚簇索引布局
  • 数据存储
    • 行数据按主键顺序存储在B+ 树叶子节点
    • 叶子节点通过双向链表连接
  • 示例
    [1] ↔ [2] ↔ [3] ↔ ... ↔ [1000000] ↔ [1000001] ↔ ...
▶ 2.LIMIT 1000000, 10的执行路径

定位 id=1

遍历链表到 id=1000000

继续读取 10 行

返回结果

  • 关键限制
    • B+ 树不存储“第 N 行的物理位置”
    • 必须从头(或上一次位置)顺序遍历链表

💡核心认知
B+ 树优化的是“范围查询”,而非“随机跳转”


二、执行模型:SQL 语义的约束

▶ 1.SQL 标准的要求
  • ORDER BY+LIMIT语义
    • 必须返回排序后第 (offset+1) 到 (offset+size) 行
    • 无法假设数据分布(如自增 ID 连续)
▶ 2.执行器的工作方式
  • 步骤
    1. 打开表扫描(Table Scan)或索引扫描(Index Scan)
    2. 逐行读取并计数
    3. 当计数 > offset 时开始收集结果
  • 伪代码
    intcount=0;while(row=fetch_next_row()){if(count>=offset){result.add(row);if(result.size()==size)break;}count++;}

📌关键点
执行器必须保证结果的正确性,无法“猜测”跳过行


三、替代方案:如何实现真正的“跳过”?

▶ 方案 1:游标分页(推荐)
  • 原理
    • 利用已知的排序字段值直接定位起始点
  • 示例
    -- 上一页最后 id=1000000SELECT*FROMordersWHEREid>1000000ORDERBYidLIMIT10;
  • 执行计划
    • type: range→ 直接跳转到 B+ 树的id=1000000位置
    • 仅扫描 10 行
▶ 方案 2:延迟关联(Deferred Join)
  • 原理
    • 先通过覆盖索引获取主键,再回表
  • 示例
    SELECTt.*FROMorders tINNERJOIN(SELECTidFROMordersORDERBYidLIMIT1000000,10)tmpONt.id=tmp.id;
  • 适用场景
    • 主键为聚簇索引(InnoDB)
    • 覆盖索引可避免回表
▶ 方案 3:记录偏移量(静态数据)
  • 原理
    • 预先计算每页的起始主键,存储到缓存
  • 示例
    // Redis 存储第 100000 页起始 ID$startId=Redis::get('page_100000_start_id');$rows=DB::select("SELECT * FROM orders WHERE id >= ? ORDER BY id LIMIT 10",[$startId]);

四、避坑指南

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

五、终极心法

**“跳过不是功能,
而是索引的舞蹈——

  • 当你利用游标
    你在跳过扫描;
  • 当你延迟关联
    你在减少回表;
  • 当你预计算偏移
    你在铸造缓存。

真正的查询优化,
始于对存储的敬畏,
成于对细节的精控。”


结语

从今天起:

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

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

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

使用 Logstash 进行数据摄取:从 PostgreSQL 到 Elasticsearch

简简单单 Online zuozuo :本心、输入输出、结果 文章目录 使用 Logstash 进行数据摄取:从 PostgreSQL 到 Elasticsearch前言1、什么是 Logstash2、Windows 下安装 Logstash3、安装 JDBC 驱动并创建管道配置4、Filter 与 Output 说明5、运行管道与验证6、…

作者头像 李华
网站建设 2026/4/30 21:51:35

从工程实践看金融级分布式清算系统的高可用与幂等设计

【精选优质专栏推荐】 《AI 技术前沿》 —— 紧跟 AI 最新趋势与应用《网络安全新手快速入门(附漏洞挖掘案例)》 —— 零基础安全入门必看《BurpSuite 入门教程(附实战图文)》 —— 渗透测试必备工具详解《网安渗透工具使用教程(全)》 —— 一站式工具手册《CTF 新手入门实战教…

作者头像 李华
网站建设 2026/4/30 19:07:39

专科生必看!9个高效降aigc工具推荐,避坑指南!

专科生必看!9个高效降aigc工具推荐,避坑指南! AI降重工具:让论文更自然,让查重更轻松 在当前高校论文写作中,AI生成内容(AIGC)的普及带来了新的挑战。许多学生在使用AI辅助写作时&…

作者头像 李华
网站建设 2026/5/1 7:51:31

AI智能体(AI Agents)全解析:大模型时代的智能系统设计与实战指南

**摘要:**AI 智能体(AI Agents)——即结合了基座模型与推理、规划、记忆及工具调用能力的系统——正迅速成为自然语言意图与现实世界计算之间的实用接口。本综述综合分析了新兴的 AI 智能体架构景观,重点关注以下三个维度&#xf…

作者头像 李华
网站建设 2026/5/1 3:43:44

基于springboot的植物健康管理系统设计实现

背景分析农业现代化与智能化需求增长,植物健康管理成为提高农业生产效率、减少资源浪费的关键环节。传统人工监测方式效率低、误差大,难以应对大规模种植场景。物联网(IoT)技术与人工智能的发展为植物健康管理提供了数据采集与分析…

作者头像 李华
网站建设 2026/4/30 6:13:32

安防监控AI-人脸与行为识别标注完全指南

🔐 引言:智能安防的数据挑战 安防监控是AI落地最成熟的领域之一。根据IDC的数据,2025年全球智能视频监控市场规模已突破500亿美元,中国市场占比超过40%。从机场、车站的人脸识别闸机,到商场、园区的行为分析系统&…

作者头像 李华