2

私の問題

ユーザーにメールをブロック (多数のユーザーに同じメールを送信: ニュースレターの一括送信) またはシングルトン ケース (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レコードが作成された日付の降順で並べ替えられた の一意のレコードをすばやく選択します。

私の質問は次のとおりです。これらのインデックスを最適な方法でインデックス化し、これらのインデックスを利用するために適切な方法でフィールドを選択するにはどうすればよいですか?

ありがとうございました!

4

1 に答える 1

1

ここにアイデアがあります。にインデックスを作成しemails(created, batchid)、 に別のインデックスを作成しますemails(batchid)。今行う:

select e.id, e.batch_id, e.user_id, e.subject, e.send_date, e.created
from (select batchid, created
      from emails
      order by created desc
      limit 10
     ) e10 join
     emails e
     on e.batchid = e10.batchid
group by e.batchid
order by created desc;

アイデアは、集計と順序付けを行う前に、処理するセットを減らすことです。

また、データがより正規化されていれば、データはより良くなるように思えます。1 つのテーブルには、送信者や作成日などのバッチ情報が含まれている必要があります。もう一方は持っている必要があります

于 2013-08-28T13:28:11.913 に答える