SQL使用150000'OR'语句删除的最有效方法

时间:2013-09-03 14:28:57

标签: mysql

我们为客户提供了约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"
)

有更好的方法吗?

3 个答案:

答案 0 :(得分:10)

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

从原始表中删除电子邮件
DELETE e 
FROM emaillist e
INNER JOIN temp_table t ON t.strEmailAddress = e.strEmailAddress
WHERE intListID = 68

然后放下临时表并完成。

答案 1 :(得分:2)

我建议采取以下步骤:

  1. 将Excel电子邮件加载到“todelete”
  2. 在“todelete”表格中的电子邮件字段中构建索引
  3. 使用您想要的值创建一个新表:

    创建表newemails as     选择 *     来自电子邮件发送者     哪里不存在(从todelete中选择1 todelete.email = emaillist.email);

  4. 截断电子邮件发件人

  5. 将列表重新插入
  6. 说,您可能会发现步骤(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上的索引(即使在查询期间创建)也可以提供很多帮助。