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

标签 mysql sql-order-by

我有这样的查询:

. . . ORDER BY col1, MAX(col2)

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

让我换一种方式问我的问题:

. . . ORDER BY id, name

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

最佳答案

要复杂得多。

我理解你的意思,是的,如果第一列已经是唯一的,则无需检查第二列,但从其他角度来看:

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

无论如何,如果我们将排序想象成简单的迭代过程,这个逻辑是可行的,但正如 ORDER BY Optimization 中所描述的那样事实并非如此。

示例 1 - 。 . .按 col1、MAX(col2) 排序

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

By default, MySQL sorts all GROUP BY col1, col2, ... queries as if you specified ORDER BY col1, col2, ... in the query as well. If you include an explicit ORDER BY clause that contains the same column list, MySQL optimizes it away without any speed penalty, although the sorting still occurs.

示例 2 - 。 . .按 ID、名称排序

正如指南所建议的,这完全取决于您定义的索引:

In some cases, MySQL can use an index to satisfy an ORDER BY clause without doing extra sorting. The index can also be used even if the ORDER BY does not match the index exactly, as long as all unused portions of the index and all extra ORDER BY columns are constants in the WHERE clause.

要确保您的查询是如何工作的,只需使用 EXPLAIN SELECT ... ORDER BY 查看它是如何被处理的。

关于mysql - 如果第一列是唯一的,是否会检查 ORDER BY 的第二列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37534763/

相关文章:

mysql - 在多个 varchar 列上优化 LEFT JOINS ORDER BY

java - hibernate从与具有一对多关系的子表完全匹配的列表中搜索查询

sql - 在窗口函数中计算运行总和

mysql - MySQL按月排序的方法

php - mysqlnd 缺少驱动程序的解决方法

MYSQL ORDER BY 2列

php - 按欧洲日期订购

mysql - 对于一个或两个字符的字符串 : CHAR(2) or VARCHAR(2)? 哪个更有效

mysql - 使用选择和分组依据插入

php - 我如何通过 html 输入表单进行 foreach 并插入多行或基于选定日期字段的一行?