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

MySQL5.7union all用法的黑科技

union all在MySQL5.6下的表现

Part1:MySQL5.6.25

[[email protected] ~]# 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

[[email protected] ~]# 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

[[email protected] ~]# /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中则不具备这一特性。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

时间: 2024-10-05 02:57:16

5分钟了解MySQL5.7union all用法的黑科技的相关文章

5分钟了解MySQL5.7对in用法有什么黑科技

MySQL5.7对in用法有什么黑科技 构建测试环境 Part1:创建测试数据库 [[email protected] ~]# mysql -uroot -p Enter password:  Welcome to the MySQL monitor.  Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.7.15-log MySQL Community Server (GPL) Copyright

10分钟了解MySQL5.7对原生JSON的支持与用法

Part1:JSON格式的支持 MySQL5.7版本终于支持了原生的JSON格式,即将关系型数据库和文档型NO_SQL数据库集于一身.本文接下来将对这特性分别就MySQL5.7和MariaDB10.1各自实现的方法异同进行介绍和演示. Part2:创建相应表结构 [[email protected] ~]# mysql -V mysql  Ver 14.14 Distrib 5.7.15, for linux-glibc2.5 (x86_64) using  EditLine wrapper m

5分钟了解MySQL5.7的Online DDL雷区

Part1:写在最前 Online DDL,当新手听到这个名字的时候,非常高兴,以为无论什么情况下,修改表结构都不会锁表,理想很丰满,现实很骨感!读完本文,教你如何避开这些雷区,安全的修改表结构.话不多说,我们分别来看下MySQL5.6和MySQL5.7在修改表结构上的相同和异同. Part2:5.6.25的表现 ①首先我们构造数据并进行测试 mysql> create database helei; Query OK, 1 row affected (0.01 sec) mysql> use

一分钟完成MySQL5.7安装部署

Part1:写在最前 MYSQL5.7.15是截止至本文撰写当日,mysql官网的最新社区版,mysql5.7的多项功能优化可以用激动人心来形容,嫌安装麻烦?没关系,跟着本文,带你1分钟搞定MySQL5.7.15数据库安装部署. Part2:仅仅安装就够了? 不,当然不够,MySQL5.7的多项功能特性更新,无法一一赘述,因此,我们先从和本文最相关的my.cnf,来解读一些MySQL5.7的部分新特性. 在之前我写过一篇MySQL5.6的新特性参数,诸如: innodb_buffer_pool_

5分钟了解MySQL5.7的undo log在线收缩新特性

Part1:写在最前 在MysQL5.6版本中,可以把undo log 回滚日志分离到一个单独的表空间里:其缺点是不能回收空间大小,until MysQL5.7,but MariadDB10.1暂不支持. 本文介绍并演示MysQL5.7是如何在线收缩undo log的. undo log日志是保存在共享表空间ibdata1文件中的,随着数据库的运行时间的不断增长,ibdata1文件会越来越大,在以往的MySQL数据库版本中,如果我们想要回收ibdata1文件所占空间,会非常的复杂和困难,必须先将

MySQL黑科技用法总结(持续更新)

1.利用set插入数值 insert [into] 表名 set 列=值.  2.利用select对字段进行测试 //A表中只有1个字段num1 int(3) ,并且有2条记录 //测试内容:查询出num1的值,测试num1的值是否等于'1',是否等于'3',num1+1的计算结果 tips:相等返回1,否则返回0 select *,num1='1',num1='3',num1+1 from A;

查找命令find的用法

find用法 在linux中一切皆文件,里面有大量的文件,我们需要在成千上万个文件找到那些我们需要的文件!!!!这时就需要用到查找命令了,find命令比locate命令的功能要齐全而且要好用的多,所以博主只在这里接受find命令的用法. find  格式:find [option]...[查找路径][查找条件][处理动作] 查找路径:默认为当前目录,自动向下递归 查找条件:可以是基于文件名,大小,类型,权限等标准进行 处理动作:对查找到的内容做处理,默认输出打印到屏幕 find是通过遍历指定路径

1分钟利用mysqlreplicate快速搭建MySQL主从

利用mysqlreplicate快速搭建MySQL主从环境 简介 mysql-utilities工具集是一个集中了多种工具的合集,可以理解为是DBA的工具箱,本文介绍利用其中的mysqlreplicate工具来快速搭建MySQL主从环境. HE1:192.168.1.248 slave HE3:192.168.1.250 master 实战 Part1:安装mysql-utilities [[email protected] ~]# tar xvf mysql-utilities-1.5.4.t

Linux基础 30分钟GDB调试快速突破

引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代得到了迅猛的发展, 这时候的李纳斯还躺在祖父公寓的摇篮里睡大觉,如果不是后来 Unix 王国自乱阵脚, 出现阵营分裂和法律纠纷,可能 Linux 系统根本都不会出现.真实的情况是, Unix 浪费了大把的时间和机会,似乎就是为了等待这个大鼻子.头发纷乱的芬兰小子长大,然后一决高下. 李纳斯赢得了自己