Mysql SQL`group by`vs` order by`性能

Mysql SQL`group by`vs` order by`性能,mysql,sql,postgresql,group-by,sql-order-by,Mysql,Sql,Postgresql,Group By,Sql Order By,tl;dr-许多公认的stackoverflow答案建议使用子查询来影响GROUPBY子句返回的行。虽然这样做有效,但这是最好的建议吗 我知道关于如何检索GROUPBY语句中的特定行,已经有很多问题了。大多数查询都围绕着在FROM子句中使用子查询展开。子查询将对表进行适当的排序,并且GROUPBY将针对现在已排序的临时表运行。一些例子, PostgreSQL不再需要使用distinct on()子句的子查询 然而,我不明白的是,在这些情况下,我试图做一些系统最初可能不是为之而设计

tl;dr-许多公认的stackoverflow答案建议使用子查询来影响
GROUPBY
子句返回的行。虽然这样做有效,但这是最好的建议吗


我知道关于如何检索
GROUPBY
语句中的特定行,已经有很多问题了。大多数查询都围绕着在
FROM
子句中使用子查询展开。子查询将对表进行适当的排序,并且GROUPBY将针对现在已排序的临时表运行。一些例子,

PostgreSQL不再需要使用
distinct on()子句的子查询

然而,我不明白的是,在这些情况下,我试图做一些系统最初可能不是为之而设计的事情时,我是多么地伤了自己的脚。以PostgreSQL和MySQL中的以下两个示例为例

在这两种情况下,我都有一个帖子表,其中包含同一帖子的多个版本(由其UUID表示)。我想在
字段中选择每个帖子的最新发布版本


我最担心的是,考虑到MySQL方法,需要一个临时表。把这个提升到“网络规模”(lolz),我想知道我是否会受到伤害。我是否应该重新考虑我的模式,或者是否有足够的方法来优化子查询parentquery关系,使其正常运行?

这绝对不是最好的建议。SQL本身(以及据我所知的MySQL文档)对于带有
orderby
的子查询的结果几乎没有什么可说的。虽然在实践中可能会订购,但不能保证一定会订购

更重要的问题是在聚合中使用“隐藏列”。考虑这个基本的查询:

select t.*
from (select t.* from table t order by datecol) t
group by t.col;
select
中除了
t.col
之外的所有内容都来自一个不确定的行。具体是(重点是我的):

MySQL扩展了GROUPBY的使用,以便选择列表可以引用 GROUP BY子句中未命名的未聚合列。这意味着 前面的查询在MySQL中是合法的。您可以使用此功能 通过避免不必要的列排序和 分组但是,这主要是在每个 未在GROUP BY中命名的未聚合列对于每个列都是相同的 组。服务器可以从每个组中自由选择任何值, 除非它们相同,否则选择的值是不确定的。 此外,不能从每个组中选择值 受添加ORDER by子句的影响。结果集的排序 在选择值后发生,并且“排序依据”不影响 服务器选择的每个组中的哪些值

编写此类查询的安全方法是:

select t.*
from table t
where not exists (select 1
                  from table t2
                  where t2.col = t.col and t2.datecol < t.datecol
                 );

这种方法应该比使用
groupby

orderby
更快,因为实际上,不管文档中建议了什么,MySQL的每个(支持子查询的)版本(到目前为止)都会返回排序结果的第一行。这很好。我理解选择哪一行的风险。但是,从性能的角度来看,如果是两个查询,我是否能够尽可能地优化此查询?也许这是一个单独的问题…我可以接受这个,然后再问另一个。
select t.*
from (select t.*,
             @rn := if(@col = col, @rn := @rn + 1, 1) as rn,
             @col := col
      from table t cross join
           (select @col := '', @rn := 0) vars
      order by col, datecol) t
where rn = 1;