【问题标题】:MySQL Combine Two Very Large Tables when three columns are equalMySQL 在三列相等时合并两个非常大的表
【发布时间】:2011-11-14 22:44:28
【问题描述】:

我有两张非常大的桌子,Table1 和 Table2。它们看起来像这样:

表 1(80 万条记录):姓名、出生日期、订单号、col4、col5、col6。

Table2(20 万条记录):姓名、出生日期、订单号、col4、col5、col6。

如何从表 1 中选择在表 2 中没有匹配的 Name、BirthDate、OrderNumber 组合的所有记录?其余列无关紧要。

我已尝试在下面执行此查询,该查询至少运行了几分钟而没有明显结束。现在我只是想选择记录然后我可以弄清楚如何组合表格。

Select Table1.Name, Table1.BirthDate, Table1.OrderNumber from Table1
left join Table2 ON 
Table1.Name=Table2.Name AND
Table1.BirthDate=Table2.BirthDate AND
Table1.OrderNumber=Table2.OrderNumber AND 
WHERE Table2.Name IS NULL;

【问题讨论】:

    标签: mysql sql join inner-join


    【解决方案1】:

    您可以尝试这种变化,看看是否更好。您还应该确保已将姓名、出生日期和订单号编入索引。

    SELECT t1.Name, t1.BirthDate, t1.OrderNumber
        FROM Table1 t1
        WHERE NOT EXISTS(SELECT NULL
                             FROM Table2 t2
                             WHERE t2.Name = t1.Name
                                 AND t2.BirthDate = t1.BirthDate
                                 AND t2.OrderNumber = t1.OrderNumber)
    

    【讨论】:

    • 这个我试过了,到现在已经运行了几分钟没有任何结果。
    • @Ray 我提到的索引存在吗?
    • 是的,当然。对不起,我忘了提到我认为这么大的桌子很明显=)
    【解决方案2】:

    如果您能在查询阶段击败您作为问题一部分包含的查询,我会感到惊讶。

    不想强调这一点,但我怀疑您的索引需要更新。为了使此查询快速运行,我相信您需要在两个表中的每一个上都有一个索引,该索引位于(Name, BirthDate, OrderNumber) 上。这与这些列上的三个独立索引非常不同。

    您也可以通过设置适当的主键来完成此操作,即PRIMARY KEY (Name, BirthDate, OrderNumber)

    如果我的猜测不正确,那么在每个表上查看SHOW CREATE TABLE 的结果会很有帮助。

    【讨论】:

    • 感谢多列索引的好主意。我不能做主键,因为其中一个字段有时可能为空。我现在将尝试使用多列索引。
    • 感谢您的回复,它帮助我产生了最终的想法。我的主要目标是将小表中的所有内容合并到大表中。所以我只是在这 3 列中创建了一个唯一的复合键并执行了“插入忽略”,因此它自动排除了导致冲突的列。
    猜你喜欢
    • 2016-08-24
    • 2012-09-12
    • 1970-01-01
    • 2023-01-17
    • 2014-09-13
    • 2010-12-01
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多