MySQL 8.0开始Group by不再排序
如題所示,mysql 8.0 開始 group by 默認(rèn)是沒有排序的
那mysql 8.0 之前和 8.0 就有可能結(jié)果出現(xiàn)不同 需要警惕
查看版本信息?
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
運(yùn)行如下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)
查看執(zhí)行 計(jì)劃 ?發(fā)現(xiàn)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)
運(yùn)行結(jié)果 是按照 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
運(yùn)行相同的sql
執(zhí)行 計(jì)劃 ?可以看出 extra 部分 已經(jīng)沒有 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)
執(zhí)行結(jié)果中 發(fā)現(xiàn) 不是按照 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
如果這種情況下 進(jìn)行分頁
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
可以發(fā)現(xiàn) 兩個結(jié)果是 不一樣的 ?,原因就是8.0之前是group by ?包含using filesort
而 8.0開始是 沒有的
為了避免這種問題,8.0開始 除了索引替換排序的優(yōu)化思路之外的相關(guān)排序我們必須使用order by來進(jìn)行
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
我是知數(shù)堂SQL 優(yōu)化班老師~ ^^
---------------------?
作者:騎龜?shù)耐米?018?
來源:CSDN?
原文:https://blog.csdn.net/qidan3500/article/details/84563296?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
總結(jié)
以上是生活随笔為你收集整理的MySQL 8.0开始Group by不再排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据清洗-python实践
- 下一篇: django项目连接远程数据库