MySQL order by语句
本文将介绍 MySQL order by 语句的执行。
一、什么是 filesort ?
- 如果索引维护的顺序恰好与 order by 语句要求的相同,则不需要额外排序,只需要从索引中依次取出数据并返回即可
- 如果索引维护的顺序与 order by 语句要求的不同,则需要进行额外的排序工作
额外的排序工作又被称为 filesort,可以通过 explain 语句查看语句执行时是否进行了 filesort。
二、filesort 的执行流程
初始化 sort_buffer
根据查询条件查询记录,将记录放入 sort_buffer 中
对 sort_buffer 中的记录做排序
排序可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和 sort_buffer_size
取结果,返回给客户端
三、全字段排序和 rowid 排序
做法:
- 全字段排序:
- 放入记录:将查询所需的所有字段放入 sort_buffer 中
- 取结果:直接从 sort_buffer 中取出结果
- rowid 排序:
- 放入记录:会将排序所需的字段和主键 ID 放入 sort_buffer 中
- 取结果:从 sort_buffer 中取出主键,根据主键从聚簇索引中获取所需字段
- 全字段排序:
全字段排序所需的空间更大;
rowid 排序所需的空间更小,但需要进行 “回表”
MySQL 会默认使用全字段排序
参考
- MySQL 技术内幕
- MySQL 实战 45 讲
- MySQL 是怎样运行的:从根儿上理解 MySQL