博客
关于我
MySQL 8.0开始Group by不再排序
阅读量:790 次
发布时间:2023-02-10

本文共 2375 字,大约阅读时间需要 7 分钟。

MySQL 8.0 版本变化对 GROUP BY 排序的影响

随着技术的不断进步,MySQL 的每一小版本都可能带来显著的变化。其中,MySQL 8.0 版本在 GROUP BY 排序机制上引入了重要的调整,这直接影响了查询结果的输出顺序。以下将详细分析这一变化及其对实际操作的影响。

1. 旧版本(MySQL 5.7)的 GROUP BY 排序

在 MySQL 5.7 及之前的版本中,GROUP BY 查询默认不会对结果进行排序。这意味着查询结果的输出顺序并非基于 GROUP BY 的关键字段(如 dept_no),而是取决于存储引擎的内部排序机制。这种默认行为可能导致两种情况:

  • 查询结果不一致:在相同数据集下,运行相同的 SQL 查询可能会返回不同的结果顺序,具体取决于 MySQL 在执行过程中所用的排序算法。

  • 性能问题:由于没有预先对结果进行排序,MySQL 需要在返回结果时进行额外的内存排序(Using temporary; Using filesort),这可能导致查询性能下降,尤其是在处理大量数据时。

示例对比

在 MySQL 5.7 的环境中,运行以下查询:

select dept_no, count(*) from t_group group by dept_no;

执行结果可能如下:

dept_no count(*)
d002 1
d006 1
d005 4
d008 2
d007 1
d004 1

然而,在另一次执行中,结果可能会不同,例如:

dept_no count(*)
d006 1
d005 4
d002 1
d008 2
d007 1
d004 1

这表明,尽管查询内容一致,结果顺序可能因排序算法的不同而变化。

2. MySQL 8.0 的改进与新行为

在 MySQL 8.0 中,GROUP BY 的默认行为发生了变化:查询结果将根据 GROUP BY 的关键字段(如 dept_no)进行排序。具体来说,结果将按照 dept_no 的升序排列。这一改进虽然解决了之前的不一致性问题,但也带来了新的需要注意的地方。

示例对比

在 MySQL 8.0 的环境中,运行相同的查询:

select dept_no, count(*) from t_group group by dept_no;

执行结果将严格按照 dept_no 的升序排列:

dept_no count(*)
d002 1
d004 1
d005 4
d006 1
d007 1
d008 2

这意味着,在 8.0 版本中,查询结果的输出顺序将更加一致且可预测。

3. 执行计划的变化

为了更深入地理解这一变化,我们可以分析执行计划(Execution Plan)。在 MySQL 8.0 中,GROUP BY 查询的执行计划中不会再包含 Using filesort 选项。这意味着,MySQL 不再需要使用临时文件来进行排序操作。相比之下,5.7 版本的执行计划中通常会包含这一选项。

示例

在 MySQL 5.7 中,执行计划可能如下:

id select_type table partitions type possible_keys key_len ref rows filtered Extra
1 SIMPLE t_group NULL ALL NULL NULL NULL 10 100.00 Using temporary; Using filesort

而在 MySQL 8.0 中,执行计划将简化为:

id select_type table partitions type possible_keys key_len ref rows filtered Extra
1 SIMPLE t_group NULL ALL NULL NULL NULL 10 100.00 Using temporary

这表明,尽管排序逻辑发生了变化,但查询性能并未显著降低。

4. 如何控制结果顺序

在 MySQL 8.0 中,虽然 GROUP BY 查询的结果将按照 dept_no 升序排列,但如果需要自定义排序规则,可以通过 ORDER BY 子句来实现。例如:

select dept_no, count(*) from t_group group by dept_no order by dept_no limit 1;

这将确保结果以 dept_no 升序排列,并且只返回第一条记录。

5. 分页操作的影响

在分页操作中,结果排序问题尤为重要。例如,在 5.7 版本中,分页查询可能不会遵循 dept_no 排序顺序,而在 8.0 版本中,结果将严格按照排序规则分页。这意味着,在进行分页时,必须确保排序规则与分页逻辑保持一致。

示例

在 5.7 版本中,分页查询可能如下:

select dept_no, count(*) from t_group group by dept_no limit 1;

结果可能只返回一条记录,但具体哪一条记录取决于排序逻辑。

而在 8.0 版本中,分页查询将严格遵循排序顺序:

select dept_no, count(*) from t_group group by dept_no order by dept_no limit 1;

这将确保仅返回排序后的第一条记录。

6. 总结

MySQL 8.0 对 GROUP BY 排序机制的改进虽然解决了旧版本的不一致性问题,但也带来了新的需要注意的地方。为了确保查询结果的稳定性和一致性,建议在 8.0 版本中使用 ORDER BY 子句来控制结果排序。此外,在分页操作中,必须确保排序与分页逻辑保持一致,以避免意外的结果。

转载地址:http://bmffk.baihongyu.com/

你可能感兴趣的文章
moment时间处理相关小结
查看>>
Mongodb sharding转换一个副本集为分片集群
查看>>
mongoDB 索引
查看>>
mongodb 默认端口号_MongoDB的简单使用
查看>>
MongoDB与Mysql常用命令解释
查看>>
mongodb中比较级查询条件:($lt $lte $gt $gte)(大于、小于)、查找条件
查看>>
Mongodb中的聚合函数使用:按月统计数量
查看>>
Mongodb主从配置
查看>>
Mongodb事务:基于spring+springmvc
查看>>
mongodb使用总结
查看>>
MongoDB出现Error parsing command line: unrecognised option ‘--fork‘ 的解决方法
查看>>
MongoDB创建用户
查看>>
mxGraph改变图形大小重置overlay位置
查看>>
MongoDB动态条件之分页查询
查看>>
MongoDB可视化客户端管理工具之NoSQLbooster4mongo
查看>>
MongoDb在Windows上的下载安装以及可视化工具的下载与使用
查看>>
MWC折腾之旅Ⅰ
查看>>
MongoDB基础介绍安装与使用
查看>>
MongoDB如何添加多数据源
查看>>
Mongodb学习总结(1)——常用NoSql数据库比较
查看>>