【问题标题】:MySQL Join multiple tables on common column with no order of importanceMySQL在公共列上加入多个表,没有重要性顺序
【发布时间】:2014-04-01 08:20:32
【问题描述】:

我有一个包含许多表的大型数据库。其中一些表可能包含email 字段。它们都是相同类型的 varchar(255)。我想要做的是将所有带有电子邮件列的表连接在一起,并获取数据库中所有唯一电子邮件的列表。

我遇到的问题是该列将有多个表,因此我需要它具有高性能。第二个问题是 afaik,将表连接在一起意味着它们必须具有从第一个表到连接表的共同值。

我希望能够做类似的事情:

SELECT
    email
FROM
    table_1
LEFT JOIN
    table_2
USING (email)
LEFT JOIN
    table_3
USING (email)

但是,我希望能够从所有表中获取所有电子邮件,无论它们是否存在于另一个表中。

对临时表中的所有表进行联合选择并从中选择不同的方法会更快吗?

我需要能够在许多表(10+)上执行此操作,其中可能包含数千到数百万行。如果需要,我会将电子邮件列设置为索引。

谢谢

【问题讨论】:

  • OUTER JOIN 不需要其他表中的相同值,但它的计算成本很高,因为 db 必须处理 N^T 结果行,其中 N 是电子邮件数,T 是表数。

标签: mysql sql join inner-join


【解决方案1】:

如果您想要来自所有表格的唯一电子邮件,包括仅出现在一个表格中的电子邮件,您应该使用UNION 而不是JOIN

SELECT DISTINCT email FROM table_a
UNION SELECT DISTINCT email FROM table_b
UNION SELECT DISTINCT email FROM table_c
...

【讨论】:

  • 我明白了,看起来我将不得不这样做,因为我的左连接查询没有按预期工作。由于表格的规模,UNION 会比 UNION ALL 和 GROUP BY 电子邮件更快吗?
  • @Ozzy 您可能需要对其进行基准测试以查看哪个更快。
  • 我认为最简单的查询对于数据库引擎来说是最容易优化的。话虽如此,基准很重要,因为与其他数据库功能相比,联合通常受到的关注要少得多。不同的实现可能会有所不同:) 从概念上讲,db 必须遍历每个表的电子邮件索引(如果没有索引,则必须遍历整个表)并保留已选择电子邮件的地图。如果您的数据集确实很大,那么将所有电子邮件(没有 distict 约束)从 db 中流式传输出来并在您的用户代码中区分结果(在另一台机器上)可能会更快。
  • 就我使用 MySQL 的经验而言,“简单”和“能够高效运行”几乎没有相关性。在这种情况下,两种解决方案都需要读取相同的行,唯一的区别(如果有)将是 distinct 和 group by 中使用的特定内部算法。
猜你喜欢
  • 2020-05-12
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多