使用join删除MySQL

使用join删除MySQL,mysql,sql,join,myisam,Mysql,Sql,Join,Myisam,我有两张桌子,都是MyISAM。表“dataproc”包含600000条记录,表“unsubscribers”包含2500条记录。当表a中的字段x与表b中的字段y匹配时,我尝试从表a中删除记录。我写的查询虽然有效,但速度非常慢(30分钟以上) 我写了一个类似的例子,在成员编号字段中有一个左连接,其中e.EMAIL=j.EMAIL,它运行得更快,但不幸的是没有相同的结果(因为并非所有成员编号都有相同的电子邮件地址)。尽管这个查询比上面的查询运行得快很多,但它在几秒钟内就完成了 要使整个删除过程与我

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

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


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

您也可以尝试此查询的
EXISTS()
版本,可能会稍微快一点:

DELETE FROM dataproc e 
WHERE EXISTS(SELECT 1 FROM unsubscribers j WHERE e.EMAIL = j.EMAIL);
30分钟对于600k记录来说似乎太多了,我相信这可以通过使用适当的索引来解决(如果你还没有索引的话)


考虑在
取消订阅者
dataproc
上的
电子邮件
列中添加索引,如果他们还没有,这将显著提高您的性能。

如果
左加入
更快,那么接下来如何;)


索引是提高性能所必需的。

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

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

实际上,它不一定会更快,如果
dataproc
包含所有
退订者
记录呢?那就没有任何效果了。@sagi绝对是的,正如你的回答所说,
index
是必要的,我的回答绝对不是一个完美的解决方案。我没有谈论索引,我是在谈论你在
LEFT JOIN
上所说的是的,我知道你说的,我也同意你的看法。我的回答只是基于对问题的描述,这甚至可能不是一个答案,但对于一个建议,作者可能会尝试一下,不是吗?或者我可以删除这个;)谢谢虽然我从未尝试过该查询,但在这两个字段上创建索引的工作却完美无缺!
DELETE e 
FROM dataproc e 
LEFT JOIN unsubscribers j ON e.EMAIL = j.EMAIL
WHERE j.EMAIL IS NOT NULL
     ALTER TABLE dataproc ADD INDEX index_one (email)
     ALTER TABLE unsubscribers ADD INDEX index_one (email)