回答
order by
子句对查询结果进行排序,确保返回结果集按照指定列或表达式的升序或降序排列。
查询 SQL 中有order by
子句并不一定会执行排序。判断语句是否执行了排序可查看执行计划中的 Extra 字段。如果该字段存在Using filesort
则说明执行了排序操作,反之则没有执行排序操作。如下:
mysql> explain SELECT * from t_user where age = 10 ORDER BY name desc;
+----+-------------+--------+------------+------+---------------+---------+---------+-------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+------+---------------+---------+---------+-------+------+----------+----------------+
| 1 | SIMPLE | t_user | NULL | ref | idx_age | idx_age | 4 | const | 3 | 100.00 | Using filesort |
+----+-------------+--------+------------+------+---------------+---------+---------+-------+------+----------+----------------+
Order By 执行流程
1、根据 SQL 条件过滤数据,如上 SQL 会把age = 10
之外的数据先过滤。
2、将符合条件的结果集放到 sort_buffer(sort_buffer 在内存)。
3、在 sort buffer 里根据name
字段对数据排序。
4、将排序结果返回给客户端。
其中sort_buffer
是 MySQL 为每个线程分配的一块用于排序的内存。可以通过sort_buffer_size
参数设置其大小。