我有两个非常大的表,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;
答案 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
的结果会很有帮助。