
“order by”是怎么工作的?
初始化 从 到主键 从 重复步骤3-4,直到不再满足 将 取出排序后的前1000行,返回给客户端。 初始化 从 取出整行数据,存入 取下一个ID_Y,重复步骤3-4。 排序 遍历排序结果,取前1000行并回到原表取出
发布日期:2021-05-07 21:24:30
浏览次数:27
分类:精选文章
本文共 1222 字,大约阅读时间需要 4 分钟。
在开发应用时,经常需要根据指定字段对结果进行排序。以市民表为例,假设需要查询城市为“杭州”的所有人姓名,并按姓名排序返回前1000个人的姓名和年龄。
SQL 语句示例
SELECT city, name, age FROM t WHERE city = '杭州' ORDER BY name LIMIT 1000;
全字段排序
在city
字段上创建索引后,使用EXPLAIN
命令分析执行情况。
排序流程
sort_buffer
,确定存储name
、city
、age
三个字段。city
索引中找到第一个满足city='杭州'
条件的主键id
(ID_X)。id
索引取出整行数据,提取name
、city
、age
三个字段,存入sort_buffer
。city
索引中取下一个记录的主键id
。city='杭州'
条件,取出ID_Y。sort_buffer
中的数据按name
字段快速排序。操作示意图
图中“按name
排序”可能在内存中完成,也可能需要使用外部排序,这取决于sort_buffer_size
参数设置。sort_buffer_size
是MySQL为排序分配的内存大小。如果排序数据量小于该值,排序在内存完成;否则,使用磁盘临时文件辅助排序。
rowid排序
在上述算法中,仅读取原表数据一次,其余操作在sort_buffer
和临时文件中执行。然而,如果查询返回的字段多,sort_buffer
中字段数过多,会导致内存不足,需要分成多个临时文件排序,影响性能。
参数优化
如果MySQL认为排序单行字段过多,可调整参数max_length_for_sort_data
。例如:
SET max_length_for_sort_data = 16;
此时,city
、name
、age
三个字段总长度为36。修改后,sort_buffer
中仅存储name
和id
。
排序流程调整
sort_buffer
,存储name
和id
。city
索引找到ID_X。sort_buffer
。sort_buffer
中的数据。city
、name
和age
。rowid排序示意图
对比全字段排序,rowid
排序多访问了一次原表,增加了磁盘读取次数。MySQL优先选择全字段排序,当内存足够时尽量减少磁盘访问。
全字段排序 vs rowid排序
- 全字段排序:内存足够时优先选择,直接返回结果,不需要回表。
- rowid排序:内存不足时使用,排序数据量更多,但需回表取数据,增加磁盘访问。
适用场景
- 全字段排序:内存充足,减少磁盘读取。
- rowid排序:内存不足,适用于大数据量排序。
总结
MySQL的排序机制根据内存情况选择合适算法,优先使用内存排序减少磁盘访问,提升性能。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月25日 20时13分25秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
基于Vue2.0+Vue-router构建一个简单的单页应用
2019-03-06
基于vue2.0实现仿百度前端分页效果(二)
2019-03-06
JS魔法堂:函数重载 之 获取变量的数据类型
2019-03-06
时间序列神器之争:Prophet VS LSTM
2019-03-06
SpringBoot中关于Mybatis使用的三个问题
2019-03-06
MapReduce实验
2019-03-06
Leaflet 带箭头轨迹以及沿轨迹带方向的动态marker
2019-03-06
java大数据最全课程学习笔记(1)--Hadoop简介和安装及伪分布式
2019-03-06
java大数据最全课程学习笔记(2)--Hadoop完全分布式运行模式
2019-03-06
还在使用集合类完成这些功能?不妨来看看 Guava 集合类!!!
2019-03-06
大部分程序员还不知道的 Servelt3 异步请求,原来这么简单?
2019-03-06
[apue] popen/pclose 疑点解惑
2019-03-06
[apue] getopt 可能重排参数
2019-03-06
移动互联网恶意软件命名及分类
2019-03-06
adb shell am 的用法
2019-03-06
PySide图形界面开发(一)
2019-03-06
Android如果有一个任意写入的漏洞,如何将写权限转成执行权限
2019-03-06
三角网格体积计算
2019-03-06
现代3D图形编程学习-基础简介(2) (译)
2019-03-06