【问题标题】:Delete matching records in two big MySQL tables删除两个 MySQL 大表中的匹配记录
【发布时间】: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# 程序来将两个表加载到有序数组或散列中并通过代码来完成......提前致谢。

【问题讨论】:

    标签: mysql sql query-optimization bigtable


    【解决方案1】:
    DELETE t1 
      FROM t1
     INNER 
      JOIN t2 
        ON t1.tel = t2.tel;
    

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多