union和union all的性能差别居然这么大!!
最近做个项目,要把我们系统中的用户数据,按照别人系统的格式要求生成数据文本,导入到别的系统中。
我们系统的用户数据主要存放在两个表中,用户信息表(user)和用户附加信息表(extend)。user表中主要是用户id,用户昵称、用户名等信息,extend表中主要是手机号、身份证、核心客户号码等信息。每个表的主键都是用户id(字段名为uid),分别有1.6亿数据,关联查询导出即可。
查询要求
核心客户号(cusnum)有效的用户,即不为空、不为零。
核心客户号(cusnum)为空,身份三要素(姓名name、证件类型certType、证件号码certNum)有效的情况。
SQL语句
查询SQL非常简单,分别将满足条件的数据查出来做个合并,导出至指定文件即可。
// 核心客户号有效
select ...from user u inner join extend e on u.uid=e.uidwhere e.cusnum IS NOT NULL and e.cusnum != '' and e.cusnum != 0
union
// 核心客户号为空,身份三要素有效
select ...from user u inner join extend e on u.uid=e.uidwhere (e.cusnum IS NULL or e.cusnum = '' or e.cusnum = 0)and (e.name IS NOT NULL and e.name != '')and (e.certType IS NOT NULL and e.certType != '')and (e.certNum IS NOT NULL and e.certNum != '')
into outfile '/xxxxx/xxxx.txt'
但是使用这个SQL,导出全部1.6亿的数据竟然用了14个小时!!!
这个时间已经远远超过了投产的时间窗口,1.6亿数据虽然会慢,但没道理会这么慢呀。
把两个SQL分别执行导出,每个语句执行了不到20分钟就完成了,但是使用union在一起竟然会变得这么慢。
union机制
随后,我就查了查mysql的union机制,才知道union不仅对多个sql的查询结果做了合并,还在合并的基础上做了默认排序,同时还去除了重复行。1.6亿的数据进行排序、归并,想想就头疼。
如果不对查询结果进行排序、去重的话,可以使用union all。
union all 只是简单的将两个结果合并后就返回。如果返回的两个结果集中有重复的数据,那么返回的结果集就会包含重复的数据了。
在我们的这个场景中,第一个语句的条件是cusnum有效,第二个语句的查询条件是cusnum无效,因此不会有重复的数据。而且我们只要把数据全部导出即可,不关注数据的顺序,因此我们可以用union all来替换union。
修改后再次执行,这次只花费不到30分钟就把数据导出了,效率提升了28倍。如果数据量更大的话,这个效率提升会更明显。
总结
UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复数据且不需要排序时的话,那么就使用UNION ALL。
union和union all的性能差别居然这么大!!相关推荐
- union和union all的性能差别居然这么大
最近做个项目,要把我们系统中的用户数据,按照别人系统的格式要求生成数据文本,导入到别的系统中. 我们系统的用户数据主要存放在两个表中,用户信息表(user)和用户附加信息表(extend).user表 ...
- 对比了下Google和百度,差别居然这么大
据说Google要入华(真的吗?),程序员的福音真的来了吗?如果Google能入成,那自然要拍手庆贺,因为,Google搜索和百度搜索,使用效果对程序员来讲差别真的很大. 举个简单例子,我们搜一下&q ...
- 国内程序员与国外程序员对比,差别居然这么大?
自1994年我国正式接入互联网,到2009年移动互联网爆发,随着国内物联网.智慧城市.智慧交通.人工智能的一路蓬勃发展,全国各地对IT人才的需求也出现了飞跃式增长. 在2019年开始之际,为了提高国内 ...
- SQL Union 和 Union All 的区别以及二者的性能问题 - 使用Sqlite演示
1 Union 和 Union All 的区别 Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: Union All:对两个结果集进行并集操作,包括重复行,不进行排序: 也 ...
- SQL Server中的Union和Union All语句之间的差异及其性能
SQL Server中的Union和Union All语句之间的差异及其性能 UNION vs UNION ALL 了解union和union all语句之间的差异及其性能. UNION UNION命 ...
- Sql性能优化之UNION、UNION ALL
SQL UNION 操作符 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每 ...
- UNION和UNION ALL有什么区别?
UNION和UNION ALL什么区别? #1楼 您可以通过运行以下查询来避免重复,并且运行速度仍然比UNION DISTINCT(实际上与UNION相同)快得多: SELECT * FROM myt ...
- Oracle中的Union、Union All、Intersect、Minus 使用用法区别
Oracle中的Union.Union All.Intersect.Minus 众所周知的几个结果集集合操作命令,今天详细地测试了一下,发现一些问题,记录备考. 假设我们有一个表Student,包 ...
- 并查集类的c++封装,比较union_find algorithm四种实现方法之间的性能差别
问题描述: 在计算机科学中,并查集是一种树型的数据结构,其保持着用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.有一个联合-查找算法(union-find algorithm)定 ...
最新文章
- 【数字信号处理】傅里叶变换性质 ( 傅里叶变换频移性质示例 )
- python中sendkeys.sendkeys_python的webbrowser模块和SendKeys模块
- 移动端阻止body左右偏移
- “~/” 代表应用程序根目录的一点误区
- 在高并发环境下该如何构建应用级缓存
- zabbix-设置邮箱预警
- cmd安装mysql_MySQL windows下cmd安装操作
- OpenCV threshold 二值化
- web使用js调用摄像头扫码、拍照、录像
- 以下内容被锁定不能编辑:mxh983 ph6527 zyt2538 zyt9276 zy2674 zyt4372 zyt8731 zyt2832求解
- [放遗忘]PR进行视频剪辑的两种办法
- 隐私政策-第三方SDK汇总
- c语言-查找字符串子串(类似strstr()函数)
- KALI-LINUX桥接模式下网络配置(学习笔记)
- 【区块链基础】4——ETH区块结构
- 使用rufus制作Windows Server 2012 R2 U盘_wentfar·tsao
- base64加密--excel--pdf--img 上传
- mstsc登录xubuntu16.04
- 考试反思计算机专业,期中考试总结反思
- 《零基础学Python》✍知识点整理