MySQL 删除并加入

MySQL Delete with join

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

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

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

为了使整个删除与我编写的第二个查询一样快,我是否需要在 1 个或两个索引字段上加入?有没有更好的方法来编写第一个查询以便它更快?

您也可以试试这个的 EXISTS() 版本,可能会稍微快一些:

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

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

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

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

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

并且 INDEX 是提高性能所必需的。

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

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