当三列相等时,MySQL组合两个非常大的表

时间:2011-11-14 22:44:28

标签: mysql sql join inner-join

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

表1(800k记录):Name,BirthDate,OrderNumber,col4,col5,col6。

表2(200k记录):Name,BirthDate,OrderNumber,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;

2 个答案:

答案 0 :(得分:2)

你可以尝试这种变化,看看它是否更好。您还应该确保索引了Name,BirthDate和OrderNumber。

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)

答案 1 :(得分:2)

如果你能在查询阶段打败你提出的问题作为问题的一部分,我会感到惊讶。

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

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

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