3

我们为客户保存了大约 35 万个电子邮件地址的数据库。

他们向我提供了几个 Excel 电子表格,其中包含他们想要删除的大约 15 万个电子邮件地址(长话短说,这是一个他们已经掌握并想要删除退回邮件的垃圾邮件列表)。

使用查找和替换的奇迹,我构建了一个查询来执行这个巨大的删除,但是查询时间太长并且超时(这并不奇怪)。

我建立的查询形式为:

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"
)

有一个更好的方法吗?

4

3 回答 3

10

将要删除的电子邮件放在临时表中。然后,您可以使用联接从原始表中删除电子邮件

DELETE e 
FROM emaillist e
INNER JOIN temp_table t ON t.strEmailAddress = e.strEmailAddress
WHERE intListID = 68

之后放下临时表并完成。

于 2013-09-03T14:31:50.797 回答
2

我建议采取以下步骤:

  1. 将 Excel 电子邮件加载到“todelete”中
  2. 在“todelete”表中的电子邮件字段上建立索引
  3. 使用所需的值创建一个新表:

    create table newemails as select * from emaillist where not exists (select 1 from todelete where todelete.email = emaillist.email);

  4. 截断电子邮件列表

  5. 将列表重新插入

话虽如此,您可能会发现步骤(1)和(2)就足够了,查询:

delete from emaillist
    where not exists (select 1 from todelete where todelete.email = emaillist.email);

但是,删除 150,000 行会在日志上产生大量流量。截断和重新插入可以节省这种开销。

于 2013-09-03T14:33:08.647 回答
0

您可以将列表导入临时表并尝试以下操作:

DELETE FROM emaillist
WHERE intListID = 68
AND strEmailAddress in (Select emailAddress From temporaryTable)

strEmailAddress 上的索引(甚至在查询期间创建)可能会有很大帮助。

于 2013-09-03T14:34:20.360 回答