提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
慢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优化容易忽视的地方,尤其是跨表的多字段综合排序

1031

被折叠的 条评论
为什么被折叠?



