数据库
首页 > 数据库> > ​mysql中的排序 -- order by​

​mysql中的排序 -- order by​

作者:互联网

前言

基础知识:

内部排序还是外部排序?

排序算法1--全字段排序

概念:将最终结果集中所有的字段都放进 sort buffer中,然后在sort buffer中针对排序字段进行快速排序。

以下面的 SQL 为例子:

SELECT nick_name, age, phone 
FROM t_user 
WHERE city = "深圳" 
ORDER BY nick_name;

假设 city 字段上有索引,全字段排序的过程:

  1. 从 city 索引树上找到第一条值为深圳的数据,取得 id 之后回表取得 nick_name、age、phone 三个字段放入 sort buffer。

  2. 从 city 索引树取下一条值为深圳的数据,重复 1 过程,直到下一条数据不满足值为深圳条件。

  3. 到这一步,所有 city = 深圳 的数据都在 sort buffer 了,然后对 nick_name 进行快速排序。

  4. 将排序结果返回

排序算法2--rowId排序

还是之前那个例子:

SELECT nick_name, age, phone 
FROM t_user 
WHERE city = "深圳"
ORDER BY nick_name;

rowId 排序全过程:

  1. 从 city 索引树上找到第一条值为深圳的数据,取得 id 之后回表取得 nick_name 这个与排序相关的字段和主键 id 一起放入 sort buffer。

  2. 从 city 索引树取下一条值为深圳的数据,重复 1 过程,直到下一条数据不满足值为深圳条件。

  3. 这时候,所有 city = 深圳 的数据都在 sort buffer 了(sort buffer 里面的数据包含两个字段: id 和 nick_name),然后对 nick_name 执行快速排序。

  4. 利用排序好的数据,使用主键 id 再次回表取其他字段,将结果返回。

注意:在步骤 4 中不会等所有排序好的 id 回表完再返回,而是每个 id 回表一次,取得该行数据之后立即返回,所以不会消耗额外的内存。

全字段排序还是rowId排序?

max_length_for_sort_data

如果单行数据的长度不大于该值,则使用全字段排序,否则使用rowId排序。

排序算法3--优先队列排序

优先队列进行排序的流程:

  1. 在所有待排序的数据,取数量为 LIMIT(本例中为 3)的数据,构建一个堆

  2. 不断的取下一行数据,更新堆节点

  3. 当所有行的扫描完,得到最终的排序结果

临时表排序

内存临时表排序

磁盘临时表排序

总结

标签:sort,name,--,回表,buffer,rowId,mysql,排序,order
来源: https://blog.csdn.net/A__17/article/details/46419981