Mysql如何在内部实现order by?按多列排序是否涉及对order by约束中指定的每一列多次扫描数据集一次?
发布于 2011-08-05 18:46:11
下面是描述:
http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
除非您有行外的列(BLOB或TEXT)或SELECT列表太大,否则将使用此算法:
WHERE子句匹配的行。按多列排序不需要扫描数据集两次,因为排序所需的所有数据都可以在一次读取中获取。
请注意,如果您有一个最左边的部分符合ORDER BY条件的索引,MySQL可以完全避免顺序,只按顺序读取值。
发布于 2021-07-26 15:12:23
MySQL很精明。它的排序算法取决于几个因素-
Available Indexes
Expected size of result
MySQL versionMySQL有两种方法可以生成排序/有序的数据流。
1.巧妙使用索引
首先,MySQL优化器分析查询,并确定它是否可以利用可用的排序索引。如果是,它自然会按索引顺序返回记录。( NDB引擎例外,它需要在从所有存储节点获取数据后执行合并排序)
由MySQL优化器负责,他们会聪明地判断索引访问方法是否比其他访问方法更便宜。
在这里看到非常有趣的事情
即使ORDER BY与索引并不完全匹配,也可以使用索引,只要ORDER BY中的其它列都是constants
2.文件排序算法
如果索引不能用于满足ORDER BY子句,MySQL将使用文件排序算法。这是一个非常有趣的算法。简而言之,它的工作原理如下
匹配的行
排序的块
中
中获取行
如果预期的结果适合于一个区块,则数据永远不会命中磁盘,而是保留在RAM中。
详细信息的- https://www.pankajtanwar.in/blog/what-is-the-sorting-algorithm-behind-order-by-query-in-mysql
https://stackoverflow.com/questions/6954981
复制相似问题