相关疑难解决方法(0)

当依靠未记录的行为来确定 MySQL 为 GROUP BY 操作中的隐藏列选择的值时,存在哪些极端情况?

GROUP BYHAVING与隐藏列,MySQL手册文件(强调):

MySQL 扩展了 的使用,GROUP BY以便选择列表可以引用GROUP BY子句中未命名的非聚合列。这意味着前面的查询在 MySQL 中是合法的。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在GROUP BY每个组中未命名的每个非聚合列中的所有值都相同时很有用。服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则选择的值是不确定的。

尽管开发人员发出了这个明确的警告,但有些人继续依赖未记录的行为来确定将从隐藏列中选择的值。

特别是,MySQL似乎经常从每个组中选择“第一”记录(其中“第一”的概念本身没有记录,例如某些存储引擎上的最旧记录或根据应用于物化表的某种排序顺序从子查询)。我已经看到这个被利用来检索,例如,分组最大值:

SELECT * FROM (
  SELECT * FROM my_table ORDER BY sort_col DESC
) t GROUP BY group_col
Run Code Online (Sandbox Code Playgroud)

为了完整起见,可以通过简单的连接以标准和文档化的方式完成相同的操作:

SELECT * FROM my_table NATURAL JOIN (
  SELECT   group_col, MAX(sort_col) sort_col
  FROM     my_table
  GROUP BY group_col
) t
Run Code Online (Sandbox Code Playgroud)

我相信人们永远不应该依赖无证行为,因为可能存在无法预见的极端情况导致该行为中断。例如,在GROUP BY用索引满足操作时,MySQL 对结果进行排序,从而可能选择一个意外的值。

还有哪些极端情况可以打破这种行为?或者它对于生产系统是否足够可靠?

mysql group-by

6
推荐指数
1
解决办法
429
查看次数

标签 统计

group-by ×1

mysql ×1