需要针对IN语句优化MySQL查询

时间:2013-06-20 09:47:10

标签: php mysql optimization

我想向我的网站用户发送批量电子邮件,电子邮件将一次发送给100k +用户。我想要实现的是记录我的mail()函数调用,即一旦将邮件发送给用户,就会在临时表中为该用户添加一个条目。这有助于我在服务器崩溃的情况下,然后我可以将电子邮件发送给其他用户。

这是我的问题:

我从users表中选择记录为NOT IN (select sent_ids from temp_table)

的记录

如果有多个已发送的ID,假设占总用户数的70%,则会使查询相对较慢。

我可以做些什么来解决我的问题?

4 个答案:

答案 0 :(得分:1)

查看mysql docs中的EXIST / NOT EXISTS优化。

答案 1 :(得分:1)

它不应该比其他变种慢,因为在大多数情况下,MySQL会尽可能地优化IN子句(至少在以后的版本中)。但是,您可以尝试通过id来LEFT JOIN临时表,然后检查sent_id IS NULL以获取您尚未发送邮件的用户。

答案 2 :(得分:1)

两个选项:

  1. 较新版本的mysql(5.6或mariadb 5.5)应该更好地处理此请求https://blog.mozilla.org/it/2013/01/29/in-subqueries-in-mysql-5-6-are-optimized-away/
  2. 您可以使用JOIN语句:SELECT users / * FROM users JOIN temptable ON send_id = user_id

答案 3 :(得分:1)

听起来像外部联接的工作:

SELECT * FROM users u 
LEFT JOIN temp_table t
    ON u.id = t.id
WHERE t.id IS NULL

这将列出尚未发送电子邮件的所有用户。