MySQL 8.0开始Group by不再排序

如题所示,mysql 8.0 开始 group by 默认是没有排序的
那mysql 8.0 之前和 8.0 就有可能结果出现不同 需要警惕
查看版本信息 

root@mysql3306.sock>[employees]>show variables like '%version%';
+-------------------------+------------------------------+
| Variable_name           | Value                        |
+-------------------------+------------------------------+
| innodb_version          | 5.7.14                       |
| protocol_version        | 10                           |
| slave_type_conversions  |                              |
| tls_version             | TLSv1,TLSv1.1                |
| version                 | 5.7.14-log                   |
| version_comment         | MySQL Community Server (GPL) |
| version_compile_machine | x86_64                       |
| version_compile_os      | linux-glibc2.5               |
+-------------------------+------------------------------+


1234567891011121314151617
运行如下SQL
表信息 

root@mysql3306.sock>[employees]>select * from t_group ;
+--------+---------+------------+------------+
| emp_no | dept_no | from_date  | to_date    |
+--------+---------+------------+------------+
|  22744 | d006    | 1986-12-01 | 9999-01-01 |
|  24007 | d005    | 1986-12-01 | 9999-01-01 |
|  30970 | d005    | 1986-12-01 | 2017-03-29 |
|  31112 | d002    | 1986-12-01 | 1993-12-10 |
|  40983 | d005    | 1986-12-01 | 9999-01-01 |
|  49554 | d008    | 1986-12-01 | 1992-05-27 |
|  48317 | d008    | 1986-12-01 | 1989-01-11 |
|  49667 | d007    | 1986-12-01 | 9999-01-01 |
|  50449 | d005    | 1986-12-01 | 9999-01-01 |
|  10004 | d004    | 1986-12-01 | 9999-01-01 |
+--------+---------+------------+------------+
10 rows in set (0.00 sec)

查看执行 计划  发现extra 部分含有 usisng fiesort 

root@mysql3306.sock>[employees]>desc select dept_no ,count(*) from t_group group by dept_no ;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+---------------------------------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra                           |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+---------------------------------+
|  1 | SIMPLE      | t_group | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   10 |   100.00 | Using temporary; Using filesort |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+---------------------------------+
1 row in set, 1 warning (0.00 sec)

运行结果 是按照 dept_no 排序 输出 

root@mysql3306.sock>[employees]>select dept_no ,count(*) from t_group group by dept_no ;
+---------+----------+
| dept_no | count(*) |
+---------+----------+
| d002    |        1 |
| d004    |        1 |
| d005    |        4 |
| d006    |        1 |
| d007    |        1 |
| d008    |        2 |
+---------+----------+
6 rows in set (0.00 sec)


123456789101112131415161718192021222324252627282930313233343536373839404142434445
下面是8.0 版本
root@mysql3308.sock>[test]>show variables like '%version%';
+-------------------------+------------------------------+
| Variable_name           | Value                        |
+-------------------------+------------------------------+
| innodb_version          | 8.0.13                       |
| protocol_version        | 10                           |
| slave_type_conversions  |                              |
| tls_version             | TLSv1,TLSv1.1,TLSv1.2        |
| version                 | 8.0.13                       |
| version_comment         | MySQL Community Server - GPL |
| version_compile_machine | x86_64                       |
| version_compile_os      | linux-glibc2.12              |
| version_compile_zlib    | 1.2.11                       |
+-------------------------+------------------------------+


root@mysql3308.sock>[test]>select * from t_group ;
+--------+---------+------------+------------+
| emp_no | dept_no | from_date  | to_date    |
+--------+---------+------------+------------+
|  22744 | d006    | 1986-12-01 | 9999-01-01 |
|  24007 | d005    | 1986-12-01 | 9999-01-01 |
|  30970 | d005    | 1986-12-01 | 2017-03-29 |
|  31112 | d002    | 1986-12-01 | 1993-12-10 |
|  40983 | d005    | 1986-12-01 | 9999-01-01 |
|  49554 | d008    | 1986-12-01 | 1992-05-27 |
|  48317 | d008    | 1986-12-01 | 1989-01-11 |
|  49667 | d007    | 1986-12-01 | 9999-01-01 |
|  50449 | d005    | 1986-12-01 | 9999-01-01 |
|  10004 | d004    | 1986-12-01 | 9999-01-01 |
+--------+---------+------------+------------+

1234567891011121314151617181920212223242526272829303132
运行相同的sql
执行 计划  可以看出 extra 部分 已经没有 using filesort 

root@mysql3308.sock>[test]>desc select dept_no ,count(*) from t_group group by dept_no ;
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-----------------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra           |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-----------------+
|  1 | SIMPLE      | t_group | NULL       | ALL  | NULL          | NULL | NULL    | NULL |   10 |   100.00 | Using temporary |
+----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-----------------+
1 row in set, 1 warning (0.00 sec)

执行结果中 发现 不是按照 dept_no 排序 输出的

root@mysql3308.sock>[test]>select dept_no ,count(*) from t_group group by dept_no ;
+---------+----------+
| dept_no | count(*) |
+---------+----------+
| d006    |        1 |
| d005    |        4 |
| d002    |        1 |
| d008    |        2 |
| d007    |        1 |
| d004    |        1 |
+---------+----------+
6 rows in set (0.00 sec)

12345678910111213141516171819202122232425
如果这种情况下 进行分页
5.7 版本
root@mysql3306.sock>[employees]>select dept_no ,count(*) from t_group group by dept_no  limit 1;
+---------+----------+
| dept_no | count(*) |
+---------+----------+
| d002    |        1 |
+---------+----------+
1 row in set (0.00 sec)
1234567
8.0版本
root@mysql3308.sock>[test]>select dept_no ,count(*) from t_group group by dept_no  limit 1;
+---------+----------+
| dept_no | count(*) |
+---------+----------+
| d006    |        1 |
+---------+----------+
1 row in set (0.00 sec)
1234567
可以发现 两个结果是 不一样的  ,原因就是8.0之前是group by  包含using filesort
而 8.0开始是 没有的
为了避免这种问题,8.0开始 除了索引替换排序的优化思路之外的相关排序我们必须使用order by来进行
5.7
root@mysql3306.sock>[employees]>select dept_no ,count(*) from t_group group by dept_no order by dept_no limit 1;
+---------+----------+
| dept_no | count(*) |
+---------+----------+
| d002    |        1 |
+---------+----------+
1 row in set (0.00 sec)

8.0
root@mysql3308.sock>[test]>select dept_no ,count(*) from t_group group by dept_no order by dept_no limit 1;
+---------+----------+
| dept_no | count(*) |
+---------+----------+
| d002    |        1 |
+---------+----------+
1 row in set (0.00 sec)
1234567891011121314151617
我是知数堂SQL 优化班老师~ ^^
--------------------- 
作者:骑龟的兔子2018 
来源:CSDN 
原文:https://blog.csdn.net/qidan3500/article/details/84563296 
版权声明:本文为博主原创文章,转载请附上博文链接!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/568266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python操作Jira提交BUG

Jira提供了完善的RESTful API,如果不想直接请求API接口可以使用Python的Jira库来操作Jira jira Python文档https://jira.readthedocs.io/en/latest/ 安装:pip install jira 认证:Jira的访问是有权限的,在访问Jira项目时首先要进…

mysql 导入导出大文件

mysql导入: load data local infile C:/Users/Administrator.USER-20190225BY/Desktop/test.csv into table test fields terminated by\t lines terminated by\n ignore 1 lines (xianlu,chepai,shijian,jing,wei) mysql导出: select * from mysql.te…

Pytest之pytest.assume用例中断言1失败会继续执行后续代码断言2

一般我们做自动化测试时,一个用例会写多个断言,当第一个断言失败后,后面的代码就不会执行了,于是我们引进了pytest-assume插件可以解决断言失败后继续断言的问题。 一、安装依赖包 pip install pytest-assume 二、使用assert进…

Unable to round-trip http request to upstream错误

这几天打开浏览器经常出现Unable to round-trip http request to upstream。提示。 一直以为是网速的问题。今天百度才发现是因为打开了蓝灯。赶紧关掉蓝灯即可

Pytest之pytest-assume同用例多断言,断言1失败会执行后续代码及断言2

一般我们做自动化测试时,一个用例会写多个断言,当第一个断言失败后,后面的代码就不会执行了,于是我们引进了pytest-assume插件可以解决断言失败后继续断言的问题。一、安装依赖包pip install pytest-assume二、使用assert进行断言…

无法打开包括文件: “corecrt.h”: No such file or directory

刚开始安装qt,测试是否安装成功就出现此问题,让人很头大 参考:https://blog.csdn.net/x356982611/article/details/51140807的播客 编译时候使用的是最新的sdk版本10.0.10586.0版本但是它里面没有ucrt目录,问题找到了。 看了下v…

Pytest-ordering自定义用例执行顺序

我们一般在做自动化测试时,用例设计之间应该是可以相互独立执行的,没有一定的前后依赖关系的,如果我们真的有前后依赖,想指定用例的先后顺序,可以用到pytest-ordering插件解决这个问题 1、安装依赖包 pip install pyt…

LNK2019无法解析的外部符号 public: static struct cv::Ptr class cv::xfeatures2d::SURF问题解决

原因是lib文件没有引入 opencv_xfeatures2d320d.lib opencv_features2d320d.lib 在配置opencv时,应把D:\Program Files (x86)\opencv3\opencv\build\x64\vc14\lib下所有的lib文件都添加到链接器的输入中 也有可能是你下载的opencv库中没有这个lib,而你…

Pytest参数选项在脚本中和命令行用法详解

运行pytest可以指定目录和文件,如果不指定,pytest会搜索当前目录及其子目录中以test_开头或以_test结尾得测试函数。我们把pytest搜索测试文件和测试用例的过程称为测试搜索(test discovery)。只要遵循pytest的命名规则&#xff0…

Win7下OpenCV3.2.0+VS2015配置

参考自:https://blog.csdn.net/qq_22812319/article/details/78335880 一、预备知识 1、下载opencv时,opencv与vs版本是有固定关系的。 2、vs一般使用release版本。 3、首先在下载的openCV解压目录opencv/build/x64/下查看文件夹名,如下图…

Pytest标记预期失败得测试用例@pytest.mark.xfail()

pytest除了测试函数中使用这个方法pytest.xfail()外,xfail还有一种使用方法。就是pytest.mark.xfail()标记预期会失败的用例,即期望测试用例是失败的,但是不会影响测试用例的的执行。 标记的用例运行后,断言失败,所以…

win7 vs2015配置qt5.11

1、下载vs,和qt。 qt百度网盘下载链接:https://pan.baidu.com/s/12bUt31_mXGvgc3tdJRkkkw 提取码:2swk 下载完成之后,直接进行安装,下一步。 安装的时候要根据自己的VS版本选择相应的msvc(VC运行库&…

LNK2019 无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被引用

在VS2017中新建Qt GUI 工程,无法编译,报链接错误 LNK2019 无法解析的外部符号 __imp_CommandLineToArgvW,该符号在函数 WinMain 中被引用 经比对,是lib配置问题。如歌在Qt Creator中创建工程然后再在VS2017中打开,则…

原创 | 开源AI测试专题、Jmeter测试专题

开源 AI 测试专题震惊!AI成功落地自动化测试AI 软件测试工具 Mabl 快速概览AI测试工具 Mabl - 测试用例自动自愈Sauce Labs 的持续 UI 自动化测试云疫情中诞生的 AI 测试工具:ai-webdriverAI 测试又多新花招?ai-webdriver-1.0.1 独家更新一眼…

Qt 二级菜单无法输入中文

一、qt中二级菜单无法输入中文 解决办法:写到其他地方再粘贴复制过来即可ok 二、qt界面设置后,vs中没有反应 解决方法:在vs中寻找 ui_projectname.h projectname即为你的项目名,查看其中是否已有你qt中已经声明的控件&#x…

Python深层解析json数据之JsonPath

我们在做接口自动化时,一般接口响应的都是json数据体,对响应数据进行提取使用或断言,当数据量很大或层级很深时,就会变得很麻烦,于是就可以用到jsonpath模块,解决json路径深取值难的问题。一、 jsonpath介绍…

VS2015+qt5.11入门(实现计算机的加法和登录操作)

1、在vs中新建qt项目 2、打开Form Files中的.ui文件。即打开qt creator界面 3、在界面中添加两个label,两个LineEdit,一个计算按钮。点击保存 控件右击-->改变对象名称可以直接改变控件名。(会映射显示在vs中的ui_projectname.h中&…

Python中map()函数用法

map() 是python的内置函数,会根据提供的函数对指定序列做映射。对可迭代函数*iterables中的每个元素应用func方法,将结果作为迭代器对象返回。注意:map()函数返回的是一个新的迭代器对象,不会改变原有对象 map()用法 class map(ob…

任务管理器只有概要信息解决办法

在任务管理器最顶端左击两下即可ok 参考自:https://wenda.so.com/q/1515482566217850

抓包工具mitmproxy环境配置使用(一)

一、mitmproxy介绍mitmproxy是一款开源的抓包工具,支持SSL的HTTP代理,它可以用于调试HTTP通信,发起中间人攻击等,还可以配合自定义python脚本使用,不同于 fiddler 或 wireshark 等抓包工具,mitmproxy 不仅可…