我有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个或两个字段上加入?有没有更好的方法来编写第一个查询,以便它快速?
答案 0 :(得分:2)
你也可以试试EXISTS()
版本,可能会稍快一些:
DELETE FROM dataproc e
WHERE EXISTS(SELECT 1 FROM unsubscribers j WHERE e.EMAIL = j.EMAIL);
对于60万条记录,30分钟听起来很多,我相信这可以通过使用适当的索引来解决(如果你还没有它们)
考虑在EMAIL
和unsubscribers
上的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)