繁体   English   中英

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

[英]Need to optimize MySQL query for IN statement

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

这是我的问题:

我从用户表中选择记录NOT IN (select sent_ids from temp_table)其中的记录NOT IN (select sent_ids from temp_table)

如果发送的ID太多(例如,占总用户的70%),则会使查询相对缓慢。

我该怎么做才能解决我的问题?

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

它不应比其他变体慢,因为在大多数情况下,MySQL会尽可能优化IN子句(至少在以后的版本中)。 但是,您可以尝试按ID左联接临时表,然后检查send_id IS NULL以获取尚未发送邮件的用户。

两种选择:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM