删除两个 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 大表中的匹配记录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL大表清空和删除正确方法

从 MySQL 中的大表中删除重复项的最快过程是啥

MySQL8 大表清空和删除正确方法

从 SQL Server 中的大表中删除大部分数据的策略

MySQL查询优化从大表中获取8-10条记录

如何从Mysql中的所有表中删除一条唯一记录