2011-05-05 48 views
2

我有2个MySQL表:t1和t2分别是1M和15M行。表t1只有1个字段:'tel'和t2有很多字段,但也有'tel'字段。我想要做的事很简单:删除t1中存在于t2中的所有行:删除两个大型MySQL表中的匹配记录

DELETE FROM t1 WHERE t1.tel IN (SELECT tel FROM t2) 

问题是此查询似乎没有完成。我让它在8核Xeon工作站上运行,2天后我决定停下来寻找替代品。我也尝试创建一个新表(tt1),并使用LEFT OUTER JOIN仅插入t2中不在t1中的行,但它似乎需要相同的时间。 t1中的'tel'字段是主键,它是t2中的唯一键(我也尝试了CREATE INDEX t2tel ON t2(tel),但它没有帮助)。

有什么建议吗?我正在考虑编写一个C#程序,将这两个表加载到有序数组或哈希中,并通过代码完成...先谢谢了。

回答

3
DELETE t1 
    FROM t1 
INNER 
    JOIN t2 
    ON t1.tel = t2.tel; 

这应该比使用子查询快得多。如果大型表格没有经过优化,您可以采取很多步骤来优化您的MySQL实例。充足的关键缓冲区是一个好的开始。还有很多其他的步骤,您最好在谷歌上进行MySQL性能调优。

+0

此外,http://www.amazon.com/High-Performance-MySQL-Optimization-Replication/dp/0596101716。最好的MySQL性能资源,永远。 – 2011-05-05 05:33:32

0

你有性能的问题,我认为那是因为你正在使用的查询,在查询内部,你最好使用加入,我做了2个简单的小表测试,我用这个:

DELETE t1 FROM t1 inner join t2 on t1.id = t2.t1_id; 

它为我工作,我希望这可以帮助你。

相关问题