博客
关于我
MySQL 8.0开始Group by不再排序
阅读量:791 次
发布时间: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/

你可能感兴趣的文章
Multisim中555定时器使用技巧
查看>>
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
MurmurHash 与其他哈希算法的区别
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
Musetalk如何优化嘴部,提高清晰度?
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>
mysql default unix_timestamp(now())
查看>>
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
Mutual Training for Wannafly Union #8 D - Mr.BG Hates Palindrome 取余
查看>>
MySql DML语言新增多行数据、修改删除多个表
查看>>
MUX VLAN (Multiplex VLAN) 提供了一种通过 VLAN 进行网络资源控制的机制
查看>>