MySQL "GROUP BY"忽略记录顺序

标签 mysql sql-order-by

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

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

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

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

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

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

最佳答案

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

这里有两个选项。要么:

  • 添加 MySQL 社区版覆盖并从中安装 MySQL,而不是从 CentOS 存储库安装,如以下众多文章之一:https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-centos-7

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

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

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

关于MySQL "GROUP BY"忽略记录顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50152817/

相关文章:

mysql - ORDER BY - 相同的值

php - Laravel 用于生产和开发的不同 config/database.php

mysql - 在MySQL中获取具有2个不同值的所有数据

python - 如何将 python 字典 pickle 到 MySQL 中?

sql - Postgres UTF8 排序

ruby-on-rails - 具有连接和顺序的不同记录

mysql - 输出排序不正确

mysql - 为什么这个查询不使用 ORDER BY 索引?

mysql - 使用小于或等于时sql查询错误

mysql - 返回 MYSQL 中包含整个单词的所有记录