【问题标题】:MySQL Delete with joinMySQL 删除与连接
【发布时间】:2016-09-21 12:15:46
【问题描述】:

我有 2 张桌子,都是 MyISAM。表 'dataproc' 有 600000 条记录,表 'unsubscribers' 有 2500 条记录。当表 A 中的字段 x 匹配表 b 中的字段 y 时,我正在尝试从表 a 中删除记录。我写的查询虽然有效,但非常慢(30 分钟以上)。

DELETE e 
FROM dataproc e 
INNER JOIN unsubscribers j ON e.EMAIL = j.EMAIL;

我写了一个类似的方法,它在会员编号字段上使用 WHERE e.EMAIL = j.EMAIL 进行左连接,它运行得更快,但不幸的是没有相同的结果(因为并非所有会员编号都有相同的电子邮件地址)。尽管此查询的运行速度比上述查询快很多,但它在几秒钟内完成。

要使整个删除过程与我编写的第二个查询一样快,我需要在 1 个或两个被索引的字段上加入吗?有没有更好的方法来编写第一个查询以使其更快?

【问题讨论】:

    标签: mysql sql join myisam


    【解决方案1】:

    你也可以试试EXISTS()这个版本,可能会快一点:

    DELETE FROM dataproc e 
    WHERE EXISTS(SELECT 1 FROM unsubscribers j WHERE e.EMAIL = j.EMAIL);
    

    30 分钟对于 60 万条记录来说听起来很多,我相信这可以通过使用适当的索引来解决(如果你还没有索引的话)

    考虑在 unsubscribersdataproc 的列 EMAIL 上添加索引,如果它们还没有,它应该会显着提高您的性能。

    【讨论】:

    • 谢谢!虽然我从未尝试过查询,但在这两个字段上创建索引完美无缺!
    【解决方案2】:

    如果LEFT JOIN更快,那么跟随如何;)

    DELETE e 
    FROM dataproc e 
    LEFT JOIN unsubscribers j ON e.EMAIL = j.EMAIL
    WHERE j.EMAIL IS NOT NULL
    

    INDEX 是提高性能所必需的。

    【讨论】:

    • 其实不一定会更快,如果dataproc包含所有unsubscribers记录呢?那么它就没有任何效果了。
    • @sagi 绝对是的,正如您的回答所说,index 将是必要的,我的回答绝对不是一个完美的解决方案。
    • 我不是说索引,我是说你在LEFT JOINs上说的
    • 是的,我知道你说的,我也同意你的看法。我的回答只是基于问题的描述,这甚至可能不是一个答案,但是对于一个建议,作者可能会尝试一下,不是吗?或者我可以删除这个;)
    【解决方案3】:

    您可以在表格中的电子邮件字段上添加非聚集索引。

         ALTER TABLE dataproc ADD INDEX index_one (email)
         ALTER TABLE unsubscribers ADD INDEX index_one (email)
    

    【讨论】:

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