使用join

时间:2016-05-24 10:28:53

标签: mysql sql join myisam

我有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;

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

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

3 个答案:

答案 0 :(得分:2)

你也可以试试EXISTS()版本,可能会稍快一些:

DELETE FROM dataproc e 
WHERE EXISTS(SELECT 1 FROM unsubscribers j WHERE e.EMAIL = j.EMAIL);
对于60万条记录,30分钟听起来很多,我相信这可以通过使用适当的索引来解决(如果你还没有它们)

考虑在EMAILunsubscribers上的dataproc栏添加索引,如果它们还没有,那么它应该会显着改善您的表现。

答案 1 :(得分:0)

如果LEFT JOIN更快,那么关注如何;)

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

INDEX是提高效果所必需的。

答案 2 :(得分:0)

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

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