約100万件のレコード「連絡先」を持つユーザーのテーブルがあります。また、送信したメールのログを別のテーブル「log_sent」に保存します。これも約 100 万レコードです。
ニュースレターをまだ受け取っていないユーザーを見つける必要があります。したがって、次のクエリを使用して、送信する必要がある次のユーザーを取得しています。
SELECT contact.*
FROM contacts AS contact
LEFT JOIN log_sent AS sent ON sent.contact_id = contact.id
WHERE sent.id IS NULL
LIMIT 0 , 1
これは、EXPLAIN クエリが返すものです。
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | contact | ALL | NULL | NULL | NULL | NULL | 1031628 |
1 | SIMPLE | sent | ref | contact_id | contact_id | 4 | admin_marketing.contact.id | 1 | Using where; Not exists
log_sent テーブルにcontact_id
インデックスが作成されました。連絡先テーブルにはid
、プライマリ インデックスとして.
このクエリの実行には約1.8
数秒かかります。また、log_sent テーブルが大きくなっているため、これが問題になります。このクエリを最適化するにはどうすればよいですか。
私が理解していることは、クエリが連絡先テーブルの100万件すべてのレコードを検索しているようです。しかし、使用するユーザー数を制限するために使用できるインデックスは実際にはありません。または多分私は何かを逃していますか?