0

サイトのユーザーに一括メールを送信したいのですが、メールは一度に 10 万人以上のユーザーに送信されます。私が達成したいのは、mail()関数呼び出しの記録を保持することです。つまり、メールがユーザーに送信されるとすぐに、そのユーザーのエントリが一時テーブルに追加されます。これは、サーバーがクラッシュした場合に残りのユーザーにメールを送信できるようにするのに役立ちます。

これが私の問題です:

レコードがある users テーブルからレコードを選択しますNOT IN (select sent_ids from temp_table)

送信された ID が多すぎる場合 (たとえば、全ユーザーの 70% としましょう)、クエリは比較的遅くなります。

問題を解決するにはどうすればよいですか?

4

4 に答える 4

1

ほとんどの場合、MySQL は IN 句を可能な限り最適化するため (少なくともそれ以降のバージョン)、他のバリアントより遅くなることはありません。ただし、一時テーブルを id で LEFT JOIN し、sent_id IS NULL をチェックして、まだメールを送信していないユーザーを取得することもできます。

于 2013-06-20T09:52:33.850 に答える
1

2 つのオプション:

  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
于 2013-06-20T09:53:25.020 に答える
1

外部結合の仕事のように聞こえます:

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

これにより、メールが送信されていないすべてのユーザーが一覧表示されます。

于 2013-06-20T09:53:54.163 に答える