优化PostgreSQL中的Query

时间:2011-04-19 06:30:51

标签: postgresql

  

可能重复:
  optimize Query in PostgreSQL

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_idcontacts_lists.list_id已编入索引 如何优化此查询?

2 个答案:

答案 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