簡體   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