SELECT count(*)
FROM contacts_lists
JOIN plain_contacts
ON contacts_lists.contact_id = plain_contacts.contact_id
JOIN contacts
ON contacts.id = plain_contacts.contact_id
WHERE plain_contacts.has_email
AND NOT contacts.email_bad
AND NOT contacts.email_unsub
AND contacts_lists.list_id =67339
此处contacts_lists.contact_id
和contacts_lists.list_id
已编入索引
如何优化此查询?
答案 0 :(得分:1)
您可能希望索引contacts.id或plain_contacts.contact_id以加速加入。其中一个字段实际上应该是主键。
如果这还不够,您可能需要重构数据库。为什么要开始使用contacts和plain_contacts表?
答案 1 :(得分:1)
由于您只想包含在连接表中设置了一些标志的行,我会将这些语句移到join子句中:
SELECT count(*)
FROM contacts_lists
JOIN plain_contacts
ON contacts_lists.contact_id = plain_contacts.contact_id
AND NOT plain_contacts.has_email
JOIN contacts
ON contacts.id = plain_contacts.contact_id
AND NOT contacts.email_unsub
AND NOT contacts.email_bad
WHERE contacts_lists.list_id =67339
我不确定这是否会对性能产生很大影响,但值得一试。您可能应该在连接表上有索引以获得最佳性能,如下所示:
plain_contacts: contact_id, has_email
contacts: id, email_unsub, email_bad