我有这样的查询:
. . . ORDER BY col1, MAX(col2)
col1
在大多数情况下都是唯一的,通常col1
在所选行之间是不同的。我只想知道,当col1
不同时,MAX(col2)
会被执行吗?因为执行它是没用的。
让我以另一种方式问我的问题:
. . . ORDER BY id, name
如您所知id
是独一无二的。在这种情况下,甚至会检查name
吗?
答案 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
查看其处理方式。