私の問題
ユーザーにメールをブロック (多数のユーザーに同じメールを送信: ニュースレターの一括送信) またはシングルトン ケース (1 人のユーザーに 1 つのメール: パスワードのリセット) で送信するメール エンジンがあります。送信された電子メールのログを表示する管理コンソールがあります。
現在、このテーブルには約 750,000 行あります。送信されるすべての EMAIL について、以下がテーブルに記録されます (主な項目に切り詰められます)。
- ID
- バッチ ID
- ユーザーID
- 主題
- 送信日
- 作成した
バッチ メールが送信される場合、そのバッチ内のすべてのメールは同じbatch_id
. 管理者がログ コンソールを参照しているときに、表の結果内のバッチからのすべてのメールを表示したくはありません。一意のメールだけです。そこで、次のようにしました。
SELECT id, batch_id, user_id, subject, send_date, created FROM `emails`
GROUP BY batch_id
ORDER BY created DESC
limit 10
これは機能しますが、遅いです。これは、クエリに対する EXPLAIN の結果です。
+----+-------------+-------------+-------+---------------+----------+---------+------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+----------+---------+------+------+---------------------------------+
| 1 | SIMPLE | emails_logs | index | NULL | batch_id | 17 | NULL | 2522 | Using temporary; Using filesort |
+----+-------------+-------------+-------+---------------+----------+---------+------+------+---------------------------------+
1 row in set (0.00 sec)
私たちの目的
batch_id
レコードが作成された日付の降順で並べ替えられた の一意のレコードをすばやく選択します。
私の質問は次のとおりです。これらのインデックスを最適な方法でインデックス化し、これらのインデックスを利用するために適切な方法でフィールドを選択するにはどうすればよいですか?
ありがとうございました!