【发布时间】:2014-07-26 14:41:17
【问题描述】:
有没有办法按唯一(主)键进行分组,本质上隐含保证该表中的其他列将被明确定义?
SELECT myPrimaryKey, otherThing
FROM myTable
GROUP BY myPrimaryKey
我知道我可以将其他列添加到语句 (GROUP BY myPrimaryKey,otherThing),但我试图避免这种情况。如果你好奇为什么,请继续阅读:
我有一个声明基本上是这样做的:
SELECT nodes.node_id, nodes.node_label, COUNT(1)
FROM {a couple of joined tables}
INNER JOIN nodes USING (node_id)
GROUP BY nodes.node_id, nodes.node_label
这工作正常,但在 MySQL 中有点慢。如果我从GROUP BY 中删除nodes.node_label,它的运行速度大约快10 倍(根据EXPLAIN,这是因为早期的连接之一开始使用索引,而之前它没有使用)。
我们正在迁移到 Postgres,因此所有新语句都应该在可能的情况下与 both MySQL 和 Postgres 兼容。现在在 Postgres 中,原来的语句运行得很快,但是新的语句(减少了 group by)不会运行(因为 Postgres 更严格)。在这种情况下,这是一个错误的错误,因为该语句实际上是明确定义的。
有没有一种我可以使用的语法,它可以让相同的语句在两个平台上运行,同时让 MySQL 只使用 group by 中的一列来提高速度?
【问题讨论】:
-
In this case, it's a false error because the statement is actually well-defined.不不不,MySql 接受 GROUP BY 的怪异事物(结果不可预测),所有其他 DBMS 迫使您获得可预测的结果(这通常很有用)。为了找到解决方案,我宁愿在索引管理上工作,以避免 MySql 缓慢! -
@RaphaëlAlthaus 通常是这样,但按主键(或任何
UNIQUE键)分组可确保同一个表中的所有其他值都定义明确。 -
但我怀疑这就是 dbms 的工作方式。我认为查询扫描和解析不会检查主键/唯一键。紧随其后的是(查询优化/执行策略)...
-
顺便说一句,如果你这样做
select nodes.node_id, MIN(nodes.node_label), count(1)... GROUP BY nodes.node_id会改变执行计划吗:这将被两个 dbms 接受? -
PostgreSQL 从 9.1 postgresql.org/docs/current/static/release-9-1.html#AEN120856987654321@开始应该支持按主键分组
标签: mysql sql postgresql group-by