2015-05-09 86 views
0

以下两个SQL语句的功能相同:在MySQL中结合SELECT DISTINCT和UNION DISTINCT - 有什么影响?

SELECT DISTINCT a,b,c FROM table1 
UNION DISTINCT 
SELECT DISTINCT a,b,c FROM table2 

SELECT a,b,c FROM table1 
UNION DISTINCT 
SELECT a,b,c FROM table2 

...因为“不同”适用于工会作为一个整体,所以是个人SELECT中的冗余的。

(注:UNION DISTINCT是相同的,只是UNION本身,但我包括DISTINCT关键字为清楚起见)

我这里有一个问题,有没有性能差异,或两者在MySQL之间执行计划的区别?或者SELECT DISTINCT是否由优化器变成了常规的SELECT

+0

(我正要指出这些查询在功能上并不相同,但我错了!他们是!YLSNED) – Strawberry

+0

我没有经验阅读EXPLAIN的输出。而且,我想知道一般情况下的答案,而不仅仅是某些特定的表格,这是EXPLAIN会告诉我的。 – Doin

+0

我刚刚在两个定义为(int,b int,cint)的临时表上尝试了'EXPLAIN',唯一的区别是用'SELECT DISTINCT's,输出在“Extra”中有“Using temporary”柱。所以我想在这个特殊情况下的答案是,它排序三次(每个'SELECT'一次,'UNION'一次?我想? – Doin

回答

0

您需要检查执行计划。但是,我认为执行计划是不同的 - 或者至少在某些情况下应该是这样。

第一个查询:

SELECT DISTINCT a, b, c FROM table1 
UNION DISTINCT 
SELECT DISTINCT a, b, c FROM table2 

可以随时利用指标对table1(a, b, c)table2(a, b, c)之前做最后的UNION。这应该通过减少数据的大小来加速最终的联盟。第二个查询没有这个优势。

其实,写这个查询的最有效的方式很可能是有两个指标及用途:

SELECT DISTINCT a, b, c FROM table1 t1 
UNION ALL 
SELECT DISTINCT a, b, c 
FROM table2 t2 
WHERE NOT EXISTS (SELECT 1 FROM table1 t1 WHERE t2.a = t1.a and t2.b = t1.b and t2.c = t1.c) 

这几乎是相同的,尽管它可能在第二个表位处理NULL值不同。

+0

我不确定表上的索引如何帮助,除非你只是所以碰巧有一个索引由a,b和c组成(任意顺序)组成,但是在我写'table1'和'table2'的地方,假设也可以有join或subquery,这将不会被编入索引... – Doin

+0

在两种情况下,您都可以通过用'<=>'替换'='来处理'NULL'。 – Doin

+0

@Doin ...尝试回答这个问题你问,无论这是否是你想要问的问题,你的问题对于表而不是子查询是很清楚的,是的,空安全的相等运算符修复了最后一个查询,如果你有关于不同查询的另一个问题,你应该问*另一个问题。编辑这个问题可能会使这个答案失效,这是不礼貌的。 –