删除两个 MySQL 大表中的匹配记录
Posted
技术标签:
【中文标题】删除两个 MySQL 大表中的匹配记录【英文标题】:Delete matching records in two big MySQL tables 【发布时间】:2011-05-05 05:26:08 【问题描述】:我有 2 个 mysql 表:t1 和 t2,它们分别是 1M 和 15M 行。表 t1 只有 1 个字段:'tel',而 t2 有很多字段,但也有一个 'tel' 字段。我要做的很简单:删除 t1 中存在于 t2 中的所有行:
DELETE FROM t1 WHERE t1.tel IN (SELECT tel FROM t2)
问题是这个查询似乎没有完成。我让它在 8 核 Xeon 工作站上运行,两天后我决定停止它并寻找替代方案。我还尝试创建一个新表(tt1)并使用 LEFT OUTER JOIN 仅插入 t2 中不在 t1 中的行,但它似乎需要相同的时间。 t1 中的 'tel' 字段是主键,它是 t2 中的唯一键(我也尝试过 CREATE INDEX t2tel ON t2(tel) 但没有帮助)。
有什么建议吗?我正在考虑编写一个 C# 程序来将两个表加载到有序数组或散列中并通过代码来完成......提前致谢。
【问题讨论】:
【参考方案1】:DELETE t1
FROM t1
INNER
JOIN t2
ON t1.tel = t2.tel;
这应该比使用子查询快得多。如果尚未针对大型表优化 MySQL 实例,您可以采取很多步骤来优化它。充足的密钥缓冲区是一个好的开始。还有很多其他的步骤,你最好点击谷歌进行 MySQL 性能调整。
【讨论】:
另外,amazon.com/High-Performance-MySQL-Optimization-Replication/dp/…。有史以来最好的 MySQL 性能资源。【参考方案2】:你遇到的性能问题我认为这是因为你在查询中使用查询,你最好使用连接,我用 2 个简单的小表进行了测试,我使用了这个:
DELETE t1 FROM t1 inner join t2 on t1.id = t2.t1_id;
它对我有用,我希望这可以帮助你。
【讨论】:
以上是关于删除两个 MySQL 大表中的匹配记录的主要内容,如果未能解决你的问题,请参考以下文章