SQL联合查询优化 用union all来代替union

转载 2011年01月07日 14:25:00

Optimizing UNION
UNION has an interesting optimization that exists across a few different databases. It's obvious when you think about how it works. UNION gives you the rows from two tables that don't exist in the other. So implicitly, you are removing duplicates. To do this the MySQL database must return distinct rows, and thus must sort the data. Sorting, as we know is expensive, especially for large tables.

UNION ALL can very well be a big speedup for you. What if you already know that your data does not contain duplicates in either row, or what if you don't care about duplicates? In either case, UNION ALL is for you. Further, there may be other ways you can avoid the duplicates in your rows using some application logic, so you know that UNION ALL will provide the results you want, without the heavy overhead of sorting the data.

union和union all的差别就在于union会对数据做一个distanct的动作,而这个distanct动作的速度则取决于现有数据的数量,数量越大则时间也越慢。而对于几个数据集,要确保数据集之间的数据互相不重复,基本是O(n)的算法复杂度。

有了理论依据后,便动手更改SQL的结构,在确保数据逻辑上不会有重复情况出现后,将2个union都改成了union all,query的反应速度从1.7秒变成了300毫秒左右,耗费时间只有以前的17%。

UNION还有一个用处,我们在海量数据的查询中,如果使用select * from tableName where id in (2,3,4,)这样的查询语句,会引起全表扫描,可以使用UNION ALL来代替,如:

select * from tableName where id=2

UNION ALL

select * from tableName where id=3

UNION ALL

select * from tableName where id=4

这样查询比使用in查询要快很多,它不会去进行全表扫描。


例2:

or语句(部分节选)

SELECT * FROM tablename where (cdp= 300 and inline=301) or (cdp= 301 and inline=301) or (cdp= 302 and inline=301) or (cdp= 303 and inline=301) or (cdp= 304 and inline=301) or (cdp= 305 and inline=301) or (cdp= 306 and inline=301) or (cdp= 307 and inline=301)

union all语句(部分节选)

SELECT * FROM tablename where (inline= 300 and cdp=300) union all SELECT * FROM tablename where (inline= 301 and cdp=300) union all SELECT * FROM tablename where (inline= 302 and cdp=300) union all SELECT * FROM tablename where (inline= 303 and cdp=300)

返回不规则的900条数据,前者用了60多秒,后者用了8秒左右。

------------------------------
用DB2测试,发现还是用IN的效率高于union all

SQL联合查询优化 用union all来代替union

Optimizing UNION UNION has an interesting optimization that exists across a few different database...

sql联合查询 JOIN和UNION区别

1.JOIN和UNION区别 join 是两张表做交连后里面条件相同的部分记录产生一个记录集, union是产生的两个记录集(字段要一样的)并在一起,成为一个新的记录集 。 JOIN用于按照...

Mysql联合查询UNION和UNION ALL的使用介绍

一、UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。 UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必须...

Mysql联合查询UNION和UNION ALL的使用介绍

原文链接:http://www.jb51.net/article/48933.htm 一、UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句...

Mysql联合查询union和union all的使用介绍

Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下 一、UNION和UNION ALL的作用和语法 UNION 用于合......

Mysql联合查询UNION和UNION ALL的使用介绍

本文详细介绍了Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下 一、UNION和UNION ALL的...

Mysql联合查询UNION和UNION ALL的使用介绍

一、UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。 UNION 内部的 SELECT 语句必须拥有相同数量的列,列也...
  • liu_cl
  • liu_cl
  • 2017年05月02日 15:48
  • 125

Mysql联合查询UNION和UNION ALL的使用介绍

Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下 一、UNION和UNION ALL的作用和语法 UNION 用于合并...

Mysql联合查询UNION和UNION ALL的使用介绍

一、UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。 UNION 内部的 SELECT 语句必须拥有相同数量的列,列也...

Mysql联合查询UNION和UNION ALL的使用介绍 可以查询出多张没有关联关系的表的数据

一、UNION和UNION ALL的作用和语法 UNION 用于合并两个或多个 SELECT 语句的结果集,并消去表中任何重复行。 UNION 内部的 SELECT 语句必须拥有相同数量的列,列也必...
  • semial
  • semial
  • 2015年12月29日 10:24
  • 4063
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SQL联合查询优化 用union all来代替union
举报原因:
原因补充:

(最多只允许输入30个字)