我们为客户提供了约350k的电子邮件地址数据库。
他们为我提供了几个excel电子表格,他们想要删除大约150k的电子邮件地址(长话短说,这是一个垃圾邮件列表,他们已经掌握并希望删除反弹)。
使用查找和替换的奇迹,我有一个查询构建来执行这个巨大的删除,但查询需要太长时间和超时(毫不奇怪)。
我构建的查询形式为:
DELETE FROM emaillist
WHERE intListID = 68
AND
(strEmailAddress = "aaaa@aaaa.com"
OR strEmailAddress = "aaab@aaaa.com"
OR strEmailAddress = "aaac@aaaa.com"
......
etc etc etc
......
OR strEmailAddress = "zzzy@zzzz.com"
OR strEmailAddress = "zzzz@zzzz.com"
)
有更好的方法吗?
答案 0 :(得分:10)
将要删除的电子邮件放在临时表中。然后,您可以使用联接
从原始表中删除电子邮件DELETE e
FROM emaillist e
INNER JOIN temp_table t ON t.strEmailAddress = e.strEmailAddress
WHERE intListID = 68
然后放下临时表并完成。
答案 1 :(得分:2)
我建议采取以下步骤:
使用您想要的值创建一个新表:
创建表newemails as 选择 * 来自电子邮件发送者 哪里不存在(从todelete中选择1 todelete.email = emaillist.email);
截断电子邮件发件人
说,您可能会发现步骤(1)和(2)就足够了,查询:
delete from emaillist
where not exists (select 1 from todelete where todelete.email = emaillist.email);
但是,删除150,000行会在日志上产生大量流量。截断和重新插入可以节省这些开销。
答案 2 :(得分:0)
您可以在临时表中导入列表并尝试类似:
DELETE FROM emaillist
WHERE intListID = 68
AND strEmailAddress in (Select emailAddress From temporaryTable)
strEmailAddress上的索引(即使在查询期间创建)也可以提供很多帮助。