以下两个SQL语句功能相同:
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
...因为" DISTINCT"适用于整个联盟,因此在SELECT
个人中是多余的。
(注意:UNION DISTINCT
本身与UNION
完全相同,但为了清晰起见,我添加了DISTINCT
关键字
我的问题是,MySQL中两者之间是否存在性能差异或执行计划差异?或优化程序将SELECT DISTINCT
变为常规SELECT
?
答案 0 :(得分:1)
您需要检查执行计划。但是,我希望执行计划是不同的 - 或者至少它们应该在某些情况下。
第一个查询:
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
值。