Using filesort 文件排序

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、排序算法选择

二、排序过程

步骤1:读取排序键和行指针

步骤2:排序键排序

步骤3:回表读取完整数据

三、排序优化策略

四、资源消耗

五、优化建议

总结



前言

慢SQL的其中一个排查方向,就是排序,排序又分为索引排序和文件排序,索引排序最大程度利用了索引,速度非常快,本次来介绍以下文件排序


提示:以下是本篇文章正文内容,下面案例可供参考

一、排序算法选择

MySQL根据数据量选择排序算法:

  • 单次排序(Single-pass)​​:数据量小,在内存中完成
  • 多路归并排序(Multi-pass)​​:数据量大,使用磁盘文件

二、排序过程

步骤1:读取排序键和行指针

-- 对于 ORDER BY a, b
-- 读取 (a, b, row_id) 三元组
SELECT a, b, row_id FROM table;

步骤2:排序键排序

  • 在 sort_buffer 中对 (a, b) 进行排序
  • 如果数据量超过 sort_buffer_size,使用磁盘临时文件

步骤3:回表读取完整数据

-- 按排序后的顺序,通过 row_id 回表读取完整行
SELECT * FROM table WHERE row_id IN (sorted_row_ids);

三、排序优化策略

MySQL使用两种策略:

  • ​< v8.0​:双路排序(two-pass),先排序键再回表
  • ​**>= v8.0**​:单路排序(single-pass),直接读取完整行到排序缓冲区

四、资源消耗

  • 内存​:sort_buffer_size 控制排序缓冲区大小
  • CPU​:排序算法的时间复杂度为 O(n log n)
  • 磁盘 I/O​:如果使用磁盘文件,涉及大量读写操作

五、优化建议

# 增大排序缓冲区
sort_buffer_size = 8M


总结

排序通常是SQL优化容易忽视的地方,尤其是跨表的多字段综合排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值