“order by”是怎么工作的?
- 初始化 sort_buffer,确定放入 name、city、age 这三个字段;
- 从索引 city 找到第一个满足 city='杭州’条件的主键 id,也就是图中的 ID_X;
- 到主键 id 索引取出整行,取 name、city、age 三个字段的值,存入 sort_buffer 中;
- 从索引 city 取下一个记录的主键 id;
- 重复步骤 3、4 直到 city 的值不满足查询条件为止,对应的主键 id 也就是图中的 ID_Y;
- 对 sort_buffer 中的数据按照字段 name 做快速排序;
-
按照排序结果取前 1000 行返回给客户端。
image.png
image.png
如果 MySQL 认为排序的单行长度太大会怎么做呢?
max_length_for_sort_data,是 MySQL 中专门控制用于排序的行数据的长度的一个参数。它的意思是,如果单行的长度超过这个值,MySQL 就认为单行太大,要换一个算法。

区别在于排序只使用name和id,排序之后再去主键索引树中查询结果集。
所以,我们可以在这个市民表上创建一个 city 和 name 的联合索引,对应的 SQL 语句是:
alter table t add index city_user(city, name);


最后再用覆盖索引优化一下即可。
网友评论