GROUP BY 需要 ORDER BY NULL 以避免文件排序

bil*_*oah 8 mysql order-by group-by

我一次又一次地注意到,当我EXPLAINGROUP BY子句查询时,我得到filesort了一个额外的条件。很久以前我读过一个建议,GROUP BY NULL在这些情况下使用以避免文件排序,它确实消除了那种令人讨厌的filesort情况。

我认为,如果不存在ORDER BY子句,则 dbms 将只提供任意顺序或最有效的任何顺序,而不是按某些需要文件排序的神秘列进行排序。对我来说,我需要包含一个额外的指示,这基本上相当于说“不要做任何愚蠢的事情”,这似乎很奇怪。

我的问题是为什么这甚至是必要的,并且ORDER BY NULL实际上增加了性能?

Aki*_*ina 9

MySQL 5.7 参考手册 / ... / SELECT 语法

如果您使用 GROUP BY,则输出行将根据 GROUP BY 列进行排序,就像您对相同的列使用 ORDER BY 一样。为了避免 GROUP BY 产生的排序开销,添加 ORDER BY NULL

  • @billynoah - MySQL 的“GROUP BY”功能暗示排序是非标准的。Oracle 可能害怕破坏依赖于它的客户 SQL(有意或无意)。规则:如果您想要订单,请说“ORDER BY”;在可能的情况下,让优化器将其丢弃。 (2认同)
  • @billynoah - 我认为历史是这样的......在黑暗时代,`GROUP BY` 的唯一实现是对数据进行排序,然后遍历它,每个“组”收集一行。后来,代码变得更聪明了,例如使用哈希表而无需排序。但是用户依赖于隐式排序。卡住。另请注意,有一个鲜为人知的语法:`GROUP BY x ASC` (2认同)