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

mysql查询中的filesort是指什么

文章目录

      • 一、filesort 的触发场景
        • 示例(触发 filesort):
      • 二、filesort 的实现方式
        • 1. 内存排序(快速排序)
        • 2. 磁盘排序(归并排序)
      • 三、如何判断是否触发 filesort?
      • 四、如何避免或优化 filesort?
        • 1. 创建“排序友好”的索引
        • 2. 调整 `sort_buffer_size`(谨慎使用)
        • 3. 减少排序的数据量
      • 五、总结

在MySQL中,filesort 是一种排序机制,当查询需要对结果进行排序(如使用 ORDER BYGROUP BY),且无法利用索引完成排序时,MySQL会通过内存或磁盘对结果集进行排序,这个过程就称为 filesort

一、filesort 的触发场景

当查询包含 ORDER BYGROUP BYDISTINCT 等需要排序的操作,且没有合适的索引可以直接返回有序结果时,MySQL会触发 filesort

示例(触发 filesort):
-- 表中无索引或索引无法覆盖排序需求
SELECT name, age FROM user WHERE city = 'Beijing' ORDER BY age;

user 表仅在 city 列有索引(idx_city),该索引可加速 WHERE city = 'Beijing' 的筛选,但无法提供 age 的有序性,因此需要对筛选后的结果进行 filesort 排序。

二、filesort 的实现方式

MySQL 的 filesort 有两种排序策略,具体使用哪种取决于结果集大小和系统变量配置:

1. 内存排序(快速排序)
  • 适用场景:结果集较小,内存足以容纳排序数据。
  • 过程
  1. 从表中读取符合条件的记录,提取“排序字段+行指针(或主键)”组成临时数组。
  2. 使用快速排序对临时数组按排序字段排序。
  3. 按排序后的顺序,通过行指针读取完整记录并返回。
  • 优点:纯内存操作,速度快。
  • 限制:受 sort_buffer_size 变量控制(默认256KB),若临时数组大小超过该值,则触发磁盘排序。
2. 磁盘排序(归并排序)
  • 适用场景:结果集较大,内存不足以容纳(超过 sort_buffer_size)。
  • 过程
  1. 分批次读取数据,每批数据在内存中排序后写入临时磁盘文件(使用快速排序)。
  2. 对所有临时文件进行归并排序,合并成一个有序的大文件。
  3. 从有序文件中读取记录并返回。
  • 缺点:涉及磁盘IO,性能远低于内存排序,可能成为查询瓶颈。

三、如何判断是否触发 filesort?

通过 EXPLAIN 分析查询计划,若 Extra 列显示 Using filesort,则表示触发了 filesort

EXPLAIN SELECT name, age FROM user WHERE city = 'Beijing' ORDER BY age;

执行结果中,Extra: Using filesort 说明该查询需要排序且未使用索引排序。

四、如何避免或优化 filesort?

filesort 本质是“无法利用索引排序时的兜底方案”,优化核心是让排序操作通过索引完成(即“索引排序”),避免触发 filesort

1. 创建“排序友好”的索引

将筛选条件和排序字段组合成联合索引,利用索引的有序性直接返回排序结果。
例如,对上述示例创建联合索引 idx_city_age(city, age)

CREATE INDEX idx_city_age ON user(city, age);
  • 该索引先按 city 筛选,同 city 下按 age 有序排列,查询 WHERE city = 'Beijing' ORDER BY age 可直接通过索引获取有序结果,避免 filesort
2. 调整 sort_buffer_size(谨慎使用)
  • 适当增大 sort_buffer_size(如 SET sort_buffer_size = 1M),可让更多排序在内存中完成,减少磁盘IO。
  • 注意:该变量是会话级参数,过大可能导致内存资源竞争(每个连接独立分配),不建议全局调大。
3. 减少排序的数据量
  • 通过 WHERE 子句提前过滤掉无关数据,缩小排序范围。
  • 仅查询必要字段(避免 SELECT *),减少排序时的临时数据量。

五、总结

  • filesort 是 MySQL 对查询结果进行排序的机制,当无法利用索引排序时触发。
  • 分为内存排序(快速排序)和磁盘排序(归并排序),磁盘排序性能较差。
  • 优化关键是创建包含“筛选+排序”字段的联合索引,让排序通过索引完成,避免 filesort

通过 EXPLAIN 分析查询计划,及时发现 filesort 并优化,是提升排序查询性能的核心手段。

http://www.dtcms.com/a/330948.html

相关文章:

  • Linux软件编程:进程和线程
  • 火山引擎数智平台发布 Data Agent“一客一策“与 AI 数据湖“算子广场“
  • 【Python】新手入门:什么是python字符编码?python标识符?什么是pyhon保留字?
  • 【数据集介绍】多种飞机检测的YOLO数据集介绍
  • 服务器数据恢复—误删服务器卷数据的数据恢复案例
  • 配置docker pull走http代理
  • 集成电路学习:什么是Video Processing视频处理
  • 网络原理-HTTP
  • 【论文阅读】基于多变量CNN模型的可穿戴外骨骼机器人人体运动活动识别
  • Notepad++插件开发实战:从零打造效率工具
  • 边缘光效果加流光效果
  • 从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.14
  • 测试开发的社区:测试之家
  • 从根源到生态:Apache Doris 与 StarRocks 的深度对比 —— 论开源基因与长期价值的优越性
  • lib.dom.d.ts
  • 速通C++类型转换(代码+注释)
  • 【自动化测试】Web自动化测试 Selenium
  • docker rm删除容器命令入门教程
  • [论文阅读] 人工智能 + 软件工程 | 从模糊到精准:模块化LLM agents(REQINONE)如何重塑SRS生成
  • Flink CDC 实战:实时监听 MySQL Binlog 并同步到 Kafka
  • 监控插件SkyWalking(二)集成方法
  • kafka 单机部署
  • 【Android】适配器与外部事件的交互
  • Mybatis学习笔记(三)
  • [激光原理与应用-267]:理论 - 几何光学 - 胶卷相机的组成和工作原理
  • PostgreSQL 免安装
  • tomcat 定时重启
  • 通过 GitHub520 项目自动获取最新 Hosts 配置,无需手动查询 IP。
  • 语义 HTML 的核心价值:提升 SEO 与 AI 理解
  • 肖臻《区块链技术与应用》第14-15讲 超越货币:以太坊如何用“智能合约”开启去中心化应用时代