ORDER BY 步骤原理

  1. select * from `film` where film_id > 80 order by title;
  • 根据WHERE等条件查询
  • 将查询结果放入sort_buffer
  • 对中间结果集按照ORDER字段排序
  • 回表生成完整结果集(若需要)

    2.中间结果集

  • 中间表比较小时,直接放在内存中

  • 中间表大于sort_buffer_size时,放在硬盘中
  • 若需要优化内存占用,减小sort_buffer_size
  • 若需要优化排序查询时间,增大sort_buffer_size

    3.回表生成完整结果集

  • 当行小于max_length_for_sort_data时,生成全字段中间表

  • 大于阈值时,只生成排序字段+主键中间表,需要回表
  • 调大阈值并不一定改善效率,因为太大的结果集排序效率低

    最高效—索引覆盖

  • 索引覆盖可以跳过生成中间结果集,直接输出查询结果

  • ORDER 字段需要有索引(或在联合索引左侧)
  • 其他相关字段(条件、输出)均在上述的索引中

比如:
select film_id, title from film ORDER BY title;

总结

  • MySQL排序一般需要生成中间结果集、排序、回表的过程
  • 索引覆盖是最高效的处理排序的方式