【问题标题】:Combining SELECT DISTINCT with UNION DISTINCT in MySQL - any effect?在 MySQL 中结合 SELECT DISTINCT 和 UNION DISTINCT - 有什么效果?
【发布时间】:2015-07-20 11:23:48
【问题描述】:

以下两条 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 DISTINCTs 是否被优化器变成了常规的SELECT

【问题讨论】:

  • (我正要指出这些查询在功能上并不相同。但我错了!它们是!YLSNED)
  • 我没有阅读 EXPLAIN 输出的经验。而且,我想知道一般情况下的答案,而不仅仅是一些特定的表格,这是 EXPLAIN 会告诉我的。
  • 我刚刚在两个定义为 (a int, b int, cint) 的临时表上尝试了EXPLAIN,唯一的区别是使用SELECT DISTINCTs,输出有“使用临时”在“额外”栏中。所以我想在这种特殊情况下的答案是它排序了三次(每个SELECT 一次,UNION 一次?我想?

标签: mysql sql distinct union


【解决方案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 值有点不同。

【讨论】:

  • 我不确定表上的索引会有什么帮助,除非您碰巧有一个由列 a、b 和 c(以任何顺序)组成(或以列开头)的索引。但是在我写了table1table2 的地方,假设也可以有一个连接或子查询,它们不会像那样被索引......
  • 您可以在这两种情况下以相同的方式处理NULLs,只需将= 替换为<=>
  • @Doin 。 . .这会尝试回答您提出的问题,无论这是否是您打算提出的问题。您的问题很清楚是关于表而不是子查询。是的,空安全相等运算符修复了最后一个查询。如果您对不同的查询还有其他问题,您应该问another 问题。编辑此问题可能会使此答案无效,这是不礼貌的。
  • Gordon... 如果您重读我的问题,您会发现它的要点是“MySQL 如何处理 UNION 中多余的 DISTINCT 修饰符?”而不是“编写此特定查询的最有效方法是什么?”。虽然您提供的答案是有用且有价值的旁注,并且确实回答了后一个问题,但它实际上并没有解释 MySql 在一般情况下的行为,这是我想要理解的。我提供的 SQL(碰巧使用了表)只是为了说明问题。
猜你喜欢
  • 2017-07-23
  • 2011-10-21
  • 2017-12-19
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2014-07-10
  • 2015-01-12
相关资源
最近更新 更多