我有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#程序将两个表加载到有序数组或哈希中并通过代码执行...提前感谢。
答案 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;
它对我有用,我希望这可以帮到你。