ORDER BY 步骤原理
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排序一般需要生成中间结果集、排序、回表的过程
- 索引覆盖是最高效的处理排序的方式
