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