5分钟了解MySQL5.7union all用法的黑科技51CTO博客 - AG环亚娱乐

5分钟了解MySQL5.7union all用法的黑科技51CTO博客

2019年03月04日13时35分47秒 | 作者: 瀚玥 | 标签: 成果,履行,查询 | 浏览: 606

MySQL5.7union all用法的黑科技


union all在MySQL5.6下的体现

Part1:MySQL5.6.25

[root@HE1 ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.25-log MySQL Community Server (GPL)
Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type help; or \h for help. Type \c to clear the current input statement.
mysql> select version();
++
| version()  |
++
| 5.6.25-log |
++
1 row in set (0.26 sec)
  
mysql> explain (select id from helei order by id) union all (select id from t where id=0 order by id);
++++-+-++-+++-+
| id | select_type  | table      | type  | possible_keys | key    | key_len | ref  | rows | Extra           |
++++-+-++-+++-+
|  1 | PRIMARY      | helei      | index | NULL          | idx_c1 | 4       | NULL | 5219 | Using index     |
|  2 | UNION        | t          | ALL   | NULL          | NULL   | NULL    | NULL |    1 | Using where     |
| NULL | UNION RESULT | <union1,2> | ALL   | NULL          | NULL   | NULL    | NULL | NULL | Using temporary |
++++-+-++-+++-+
3 rows in set (0.00 sec)

能够看出,在MySQL5.6版别中,履行成果如下图所示:

从履行计划来看,是把helei表的查询成果和t表的查询成果合并在了一张暂时表里,然后输出给客户端。


union all在MySQL5.7/MariaDB10.1下的体现

Part1:MySQL5.7.15

[root@HE1 ~]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.15-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type help; or \h for help. Type \c to clear the current input statement.
mysql> select version();
++
| version()  |
++
| 5.7.15-log |
++
1 row in set (0.00 sec)、
mysql> explain (select id from helei order by id) union all (select id from t where id=0 order by id);
++-+-++-+-++-++++-+
| id | select_type | table | partitions | type  | possible_keys | key    | key_len | ref  | rows | filtered | Extra       |
++-+-++-+-++-++++-+
|  1 | PRIMARY     | helei | NULL       | index | NULL          | idx_c1 | 4       | NULL | 5212 |   100.00 | Using index |
|  2 | UNION       | t     | NULL       | ALL   | NULL          | NULL   | NULL    | NULL |    1 |   100.00 | Using where |
++-+-++-+-++-++++-+
2 rows in set, 1 warning (0.00 sec)

能够看出,在MySQL5.7版别中,履行成果如下图所示:




Part2:MariaDB10.1.16

[root@HE3 ~]# /usr/local/mariadb/bin/mysql -uroot -S /tmp/mariadb.sock 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 10.1.16-MariaDB MariaDB Server
Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.
Type help; or \h for help. Type \c to clear the current input statement.
MariaDB [(none)]>
MariaDB [helei]> explain (select id from helei order by id) union all (select id from t where id=0 order by id);
++-+-+-+-++-+++-+
| id   | select_type | table | type  | possible_keys | key    | key_len | ref  | rows | Extra       |
++-+-+-+-++-+++-+
|    1 | PRIMARY     | helei | index | NULL          | idx_c1 | 4       | NULL | 5198 | Using index |
|    2 | UNION       | t     | ALL   | NULL          | NULL   | NULL    | NULL |    1 | Using where |
++-+-+-+-++-+++-+
2 rows in set (0.00 sec)

能够看出在MariaDB10.1中,履行成果如下图所示:

从履行成果看,无论是MySQL5.7仍是MariaDB10.1,都没有创立暂时表,依照次序,helei表的查询成果首要输出到客户端,然后t表的查询成果再输出到客户端。


本文中的优化只针对union all,对union和在最外层运用order by无效。如下图是所示:





——总结——

在MySQL5.7/MariaDB10.1中,union all不再创立暂时表,这样在联合查询时会削减I/O开支,在MySQL5.5/5.6中则不具有这一特性。因为笔者的水平有限,编写时刻也很匆促,文中难免会呈现一些过错或许不精确的当地,不当之处恳请读者批评指正。



版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表AG环亚娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章