一句话导读
ORDER BY 不能走索引时,MySQL 会在 Server 层做一次 filesort。内部实现分 单路(全字段)双路(rowid) 两种;了解它们的触发条件、判别方法与调优思路,是 SQL 性能优化的必修课。


一、为什么会有 filesort?

  • 当查询无法利用 覆盖索引索引顺序 满足 ORDER BY 时,MySQL 需要把结果集读出来再排序。

  • 这个排序逻辑统称 filesort,但它未必落盘,绝大多数情况下在内存完成。


二、单路 vs 双路:一张图看懂差异

阶段单路排序 (Single-Pass)双路排序 (Two-Pass)
读取列所有查询列一次性读入 sort buffer只读 排序键 + rowid
排序对象完整记录<排序键, rowid> 二元组
回表不需要按 rowid 二次回表取整行
内存消耗高(存整行)低(只存键+id)
I/O 特征顺序读一次随机读两次
典型触发查询列总字节 ≤ max_length_for_sort_data超过阈值或含大 TEXT/BLOB

三、内部流程拆解

  1. 单路排序

    1. 扫表/索引 → 把需要的 所有列 拷进 sort_buffer

    2. 在内存(或磁盘临时文件)里按排序键快排/归并

    3. 直接返回结果给客户端

  2. 双路排序

    1. 只取 排序键 + 聚簇主键(rowid) 进 sort buffer

    2. 排序后得到“排好序的 rowid 列表”

    3. 按 rowid 顺序回表 取其余列 → 返回


四、如何查看 MySQL 使用了哪一种?

MySQL 不直接写“单路/双路”字样,而是把信息藏在 optimizer traceEXPLAIN FORMAT=json 里。

方法 1:EXPLAIN FORMAT=json(MySQL 8.0 推荐)

EXPLAIN FORMAT=json
SELECT * FROM orders
WHERE order_date >= '2025-01-01'
ORDER BY total_amount DESC LIMIT 20\G

在输出里查找:

"filesort_information": [{"sort_mode": "<sort_key, rowid>"          <-- 双路/* 或 "<sort_key, additional_fields>" */  <-- 单路}
]
  • <sort_key, rowid> → 双路

  • <sort_key, additional_fields><sort_key, packed_additional_fields> → 单路

方法 2:optimizer trace(所有版本通用)

-- 会话级开启
SET optimizer_trace="enabled=on";
-- 执行目标 SQL
SELECT ... ORDER BY ...;
-- 查看 trace
SELECT * FROM information_schema.optimizer_trace\G

搜索关键字:

"filesort_summary": {"sort_mode": "<sort_key, rowid>"
}

含义同上。

方法 3:慢查询日志 / performance_schema(线上无侵入)

  • MySQL 8.0.13+ 的 慢日志 JSON 会记录 "sort_mode" 字段。

  • performance_schema 表 events_statements_history_long 中:

    • SUM_SORT_ROWS 累计排序行数

    • SUM_SORT_ROW_ID > 0 可侧面反映双路排序


五、调优策略速查表

目标手段
避免 filesort建立覆盖索引 (order_col, ...),使 EXPLAIN 出现 Using index
保持单路减少查询列宽度;避免 SELECT *;调大 max_length_for_sort_data
降低内存压力若列过大,可接受双路;或把大 TEXT/BLOB 拆子表延迟加载
加速排序调大 sort_buffer_size(会话级);确保 tmp_table_size/max_heap_table_size 足够

示例调优:

-- 会话级只对当前连接生效
SET sort_buffer_size = 4*1024*1024;          -- 4 MB
SET max_length_for_sort_data = 4096;         -- 允许更长列走单路

六、实战案例

场景:订单宽表 orders 30+ 列,含 TEXT 备注字段。

  1. 初始 SQL:

SELECT * FROM orders
WHERE order_date >= '2025-01-01'
ORDER BY total_amount DESC
LIMIT 20;

EXPLAIN FORMAT=json 看到 "sort_mode": "<sort_key, rowid>",慢日志显示 Sort_row_id: 125000
→ 触发双路+大量回表,耗时 1.2 s。

  1. 优化:

    • 去掉 * 只取需要的 5 列,列宽 < 3 KB

    • 新建复合索引 (order_date, total_amount DESC)覆盖查询列

  2. 结果:

    • EXPLAIN 出现 Using index; Using filesort 消失

    • 查询降至 12 ms,CPU 降 90%。


七、结论

  1. 单路排序 用内存换 I/O,适合小字段;

  2. 双路排序 用 I/O 换内存,适合大字段;

  3. 通过 EXPLAIN FORMAT=jsonoptimizer_trace 查看 sort_mode 即可判定;

  4. 真正的高性能优化是 让排序走索引,彻底告别 filesort。

一句话:看不到 Using filesort,才是 ORDER BY 的终极答案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916705.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916705.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916705.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenLayers 综合案例-信息窗体-弹窗

看过的知识不等于学会。唯有用心总结、系统记录&#xff0c;并通过温故知新反复实践&#xff0c;才能真正掌握一二 作为一名摸爬滚打三年的前端开发&#xff0c;开源社区给了我饭碗&#xff0c;我也将所学的知识体系回馈给大家&#xff0c;助你少走弯路&#xff01; OpenLayers…

GaussDB 开发基本规范

1 集中式1.1数据库价值特性推荐特性分类特性列表说明表类型PARTITION表数据分区存储引擎行存储按行顺序存储表&#xff0c;建议点查&#xff0c;增删改操作较多场景下使用事务事务块显式启动事务单语句事务不显式启动事务&#xff0c;单语句即为事务扩容在线扩容扩节点和数据重…

工作中使用git可能遇到的场景

1.main历史发布版本出问题需要查看&#xff0c;怎么切换历史发布版本&#xff1f;git reset --hard commitid 更新本地库和代码2.A分支的代码已经做过一些功能&#xff0c;想迁移到B分支当前在A分支git checkout B &#xff08;切换到B分支&#xff09;git cherry-pick A的com…

【Spring AI】本地大型语言模型工具-Ollama

Ollama 是一个专注于在本地运行大型语言模型&#xff08;LLM&#xff09;的工具&#xff0c;支持多种开源模型&#xff08;如 Llama 3、Mistral、Gemma 等&#xff09;&#xff0c;提供简单的命令行和 API 接口。<dependency><groupId>org.springframework.ai</…

电机S加减速

STM32步进电机S型加减速算法_stm32___build__-2048 AI社区 以上&#xff0c;电机加减速说的非常清楚&#xff0c;收藏点赞&#xff01;

一、初识 Linux 与基本命令

作者&#xff1a;IvanCodes 日期&#xff1a;2025年7月28日 专栏&#xff1a;Linux教程 思维导图 一、Linux 简介 1.1 什么是 Linux? Linux 是一种自由、开源的类Unix操作系统内核&#xff0c;由林纳斯托瓦兹 (Linus Torvalds) 在1991年首次发布。我们通常所说的 “Linux 系统…

解决angular与jetty websocket 每30s自动断连的问题

背景&#xff1a;前端&#xff1a;angular 12&#xff0c;websocket接口由lib.dom.d.ts提供后端&#xff1a;java&#xff0c;websocket接口由jetty 12提供问题现象&#xff1a;前端连上server后&#xff0c;每隔30s就会断开&#xff0c;由于长时间空闲&#xff0c;会导致webso…

【机器学习深度学习】模型私有化部署与微调训练:赋能特定问题处理能力

目录 前言 一、私有化部署的背景&#xff1a;通用能力 ≠ 企业实用 暴露问题 二、微调训练的核心目的 2.1 动作一&#xff1a;私有化部署&#xff08;Private Deployment&#xff09; 2.2 动作二&#xff1a;领域微调&#xff08;Domain Fine-Tuning&#xff09; 2.3 微…

Seq2Seq学习笔记

Seq2Seq模型概述Seq2Seq&#xff08;Sequence-to-Sequence&#xff09;是一种基于深度学习的序列生成模型&#xff0c;主要用于处理输入和输出均为序列的任务&#xff0c;如机器翻译、文本摘要、对话生成等。其核心思想是将可变长度的输入序列映射为另一个可变长度的输出序列。…

react useId

useId useId 是 React 18 引入的一个内置 Hook&#xff0c;用于生成唯一且稳定的 ID &#xff0c; 主要用于&#xff0c;解决在客户端和服务器端渲染&#xff08;SSR&#xff09;时&#xff0c;动态生成 ID 可能导致的冲突问题&#xff1b; 特别适合用于&#xff0c;需要关联 H…

排水管网实时监测筑牢城市安全防线

排水管网的实时监测工作&#xff0c;强调其对于保障城市安全的重要作用。“排水管网”明确了具体的关注对象&#xff0c;它是城市基础设施的重要组成部分&#xff0c;承担着雨水、污水排放等关键功能。“实时监测”突出了监测的及时性和持续性&#xff0c;意味着能够随时获取排…

SZU大学物理实验报告|电位差计

写在前面&#xff1a;博文里放图片&#xff0c;主要省去了对文档的排版时间&#xff0c;实验还是要自己做的&#xff0c;反正都要去实验室上课&#xff0c;顺带锻炼下动手能力。有些结果是实验手写的&#xff0c;所以看不到&#xff0c;有结果的可以对下结果差的不太多就行&…

RoPE简单解析

文章目录简介拆解一些tricks简介 因为RoPE的优异性能&#xff0c;其已成为各种大模型中位置编码的首选&#xff0c;包括多模态模型&#xff1b;在一些多模态模型或视频理解模型中&#xff0c;甚至会用到多维度RoPE。虽然RoPE已广泛应用&#xff0c;之前也看了不少针对其原理解…

windows 获取 APK 文件的包名和启动 Activity 名称

使用 aapt 命令确保环境变量配置正确&#xff1a;首先需要确保你的系统环境变量中包含了 Android SDK 的 build-tools 目录路径。这是因为 aapt 工具位于该目录下。运行命令&#xff1a; 打开命令提示符&#xff08;CMD&#xff09;&#xff0c;然后输入以下命令来查看 APK 的详…

【Mac版】Linux 入门命令行快捷键+联想记忆

Linux Mac 用户终端命令行快捷键 符号速查全解作为一个刚接触 Linux 和终端的 macOS 用户&#xff0c;常常被命令行的各种快捷键和符号弄得头晕脑胀&#xff0c;本文将带你系统地掌握命令行中最常用的快捷键和符号&#xff0c;并通过逻辑联想帮助你轻松记住每一个组合。一、基…

AUTOSAR Mcal Dio - 模块介绍 + EB配置工具介绍

文章目录1. 模块简介2. 主要功能3. 缩略语4. API接口5. 功能介绍5.1. ChannelGroup5.2. Dio_MaskedWritePort6. 序列图6.1.读GPIO电平6.2. 设置GPIO电平7. EB 工具配置7.1.General7.2.DioPort8. 参考资料1. 模块简介 Dio&#xff0c;全称“Digital Input Output”。Dio模块&am…

ICT模拟零件测试方法--晶体管测试

ICT模拟零件测试方法–晶体管测试 文章目录ICT模拟零件测试方法--晶体管测试晶体管测试晶体管测试配置晶体管测试配置晶体管测量选项晶体管测试 i3070 在线测试软件为每个晶体管提供两种测试&#xff1a; 使用二极管测试对晶体管的两个 PN 结进行测试。这是检查设备存在的快速…

AI算法实现解析-C++实例

基于C++实现的AI 以下是基于C++实现的AI/机器学习相关示例,涵盖基础算法、计算机视觉、自然语言处理等领域,适合不同阶段的学习者参考: 基础机器学习算法 线性回归 使用梯度下降法预测连续值,核心公式: 损失函数: 逻辑回归 二分类问题实现,Sigmoid函数: K-Means…

亚马逊云科技实战架构:构建可扩展、高效率、无服务器应用

对于今天的开发者、架构师和技术爱好者而言&#xff0c;云计算早已超越了简单的“虚拟机租赁”或“服务器托管”阶段。它已经演化为一套丰富、强大且精密的工具集&#xff0c;能够以前所未有的方式设计、部署和扩展应用程序。真正的云原生思维&#xff0c;是掌握并运用多种架构…

论文阅读:《无约束多目标优化的遗传算法,群体和进化计算》

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…