如果第一列是唯一的,是否会检查ORDER BY上的第二列?

时间:2016-05-30 23:27:30

标签: mysql sql-order-by

我有这样的查询:

. . . ORDER BY col1, MAX(col2)

col1在大多数情况下都是唯一的,通常col1在所选行之间是不同的。我只想知道,当col1不同时,MAX(col2)会被执行吗?因为执行它是没用的。

让我以另一种方式问我的问题:

. . . ORDER BY id, name

如您所知id是独一无二的。在这种情况下,甚至会检查name吗?

1 个答案:

答案 0 :(得分:0)

它要复杂得多。

我明白你的观点是的,如果第一列已经是唯一的,那么不用检查第二列,而是从其他观点来看:

为什么要包含第二列,如果第一列已经是唯一的?

无论如何,如果我们想象排序是简单的迭代过程,这种逻辑是有效的,但正如ORDER BY Optimization中描述的那样,情况并非如此。

示例1 - . . . ORDER BY col1, MAX(col2)

对于这种情况,您在SQL中使用了GROUP BY,优化指南建议如下:

  

默认情况下,MySQL会对所有GROUP BY col1,col2,...查询进行排序,就像您一样   在查询中也指定了ORDER BY col1,col2,....如果你   包含一个包含相同列的显式ORDER BY子句   列表,MySQL优化它没有任何速度惩罚,虽然   排序仍然发生。

示例2 - . . . ORDER BY id, name

如指南所示,这一切都取决于您定义的索引:

  

在某些情况下,MySQL可以使用索引来满足ORDER BY子句   没有做额外的排序。   即使ORDER BY与之匹配,也可以使用索引   索引完全,只要索引的所有未使用部分和所有   额外的ORDER BY列是WHERE子句中的常量。

要确保查询的工作方式,只需使用EXPLAIN SELECT ... ORDER BY查看其处理方式。