我有一张用户表,其中包含大约 100 万条“联系人”记录。我们将我们发送的电子邮件记录在另一个表“log_sent”中,该表也有大约 1M 条记录。
我们需要找出哪些用户还没有收到我们的时事通讯。所以我使用以下查询来获取我们需要发送给的下一个用户:
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 万条记录。但是我真的没有索引可以用来限制使用的用户数量。或者也许我错过了什么?