删除两个大型MySQL表中的匹配记录

时间:2011-05-05 05:26:08

标签: mysql sql query-optimization bigtable

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

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#程序将两个表加载到有序数组或哈希中并通过代码执行...提前感谢。

2 个答案:

答案 0 :(得分:3)

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

这应该比使用子查询快得多。对于大型表,如果尚未对MySQL实例进行优化,可以采取很多步骤来优化它们。充足的密钥缓冲是一个良好的开端。还有很多其他步骤,你最好点击Google for MySQL性能调整。

答案 1 :(得分:0)

你的性能问题我认为这是因为你在查询中使用查询,你最好使用连接,我用2个简单和小的表做了测试,我使用了这个:

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

它对我有用,我希望这可以帮到你。