MySQL "GROUP BY" 忽略记录顺序

MySQL "GROUP BY" ignores record order

我们刚刚将数据库从 MySQL 5.0 服务器迁移到 5.5 服务器,像这样的简单查询似乎不再按预期工作:

    SELECT * FROM (
        SELECT *
        FROM tblTable
        ORDER BY fldField ASC
    ) tmp
    GROUP BY fldField

内部查询仍然是 returns 正确排序的记录集,但分组依据不再选择该集的第一条记录。

将顺序切换为 DESC 也没有影响,因此推测分组依据尚未切换为选择最后一条记录。

据我所知,group by实际上只是按照它们创建的顺序选择第一条记录,而不是实际记录集的顺序。如果这有意义?

我似乎找不到任何错误报告或更改日志说明,所以希望这里有人有想法吗?

事实证明,CentOS 7 搭载的是 MariaDB 而不是 MySQL,而且 MariaDB 忽略了内部查询的 ORDER BY 子句,让外部查询将内部查询的结果集作为未排序的 table,以获得更好的性能。

这里有两个选项。或者:

  • 添加 MySQL 社区版覆盖并从中安装 MySQL 而不是从 CentOS 存储库安装,就像这篇文章中的一篇那样:https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-centos-7

  • 或者将具有 ORDER BY 子句的内部查询修改为也具有 LIMIT 子句,这会导致 MariaDB 将结果集视为有序 table。例如

    SELECT * FROM (
        SELECT *
        FROM tblTable
        ORDER BY fldField ASC
        LIMIT 10000000
    ) tmp
    GROUP BY fldField
    

希望这可以为其他人节省一些时间。