MySQL中可接受的分组最大化技术

时间:2012-01-10 17:42:00

标签: mysql sql

由于“人人都知道”,您无法在GROUP BY中返回未分组的非聚合列,换句话说,“向我提供最高薪水的员工的ID,姓名和地址每个部门。“当然这不是真的:http://dev.mysql.com/doc/refman/5.1/en/group-by-hidden-columns.html但这包含一个相当不祥的警告:

  

服务器可以自由选择每个组中的任何值,因此除非他们   如果是相同的,所选择的值是不确定的。

MySQL还有另一篇关于这个问题的文章:http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html但是推荐的技术并没有真正利用所有隐藏的列。 Kasey Speakman的那篇文章中有评论,他建议使用有序的子查询,如下所示:

select deptno, emp_id, address, name from
(select * from emp order by salary desc)
group by deptno

我的问题是:a)我可以安全地依赖MySQL从每个组中选择“第一”行,因为子查询是有序的,并且b)一般而言,假设适当的索引,这可能比比方说,同一篇文章中提到的LEFT JOIN技术?

1 个答案:

答案 0 :(得分:1)

最近在这里讨论了类似的问题:SQL: What is the default Order By of queries?

但是,尽管如此,我认为排名查询是MySQL中查询的示例,依赖于预测顺序(通过使用特定索引预测)非常有用。

查看我对以下问题的回答:Retrieving the last record in each group

这是你问题的答案:

  1. 是的,有时你可以在知道引擎和使用的索引时依赖订单,虽然它通常不被友好接受

  2. 当每个组中有很多项时,LEFT JOIN解决方案可能需要很长时间才能执行,因此依赖裸索引可能几乎成为唯一的解决方案。但是解决方案不应该生成巨大的中间临时表。

  3. 但是您的查询:

    select deptno, emp_id, address, name from
    (select * from emp order by salary desc)
    group by deptno
    

    是最糟糕的想法,因为它会生成表的无索引副本并对其进行操作而不使用任何优化。