多元化加入太长时间了

时间:2014-03-01 23:28:59

标签: mysql sql join

我遇到了此查询的问题。这花了太长时间。

SELECT COUNT(DISTINCT d.contactid ) AS tot
FROM todo_contacts a
    LEFT JOIN contactlists b ON a.calllistid = b.listid
    LEFT JOIN contact_list_relationship c ON c.listid = b.listid
    INNER JOIN contacts d ON ( d.contactid = c.contactid OR a.contactid = d.contactid ) AND d.customerid =  '100'
WHERE a.customerid =  '100'

todo_contacts可以直接联系与联系人表格相关的联系人,或联系联系人列表的联系人。

这个问题似乎真的如此。如果我将1行插入todo_contacts,其中contactlistid中的联系人列表在contact_list_relationship中有50,000个关系(其中存储了联系人列表和联系人之间的关系),则查询很慢(花费几分钟)。如果我删除查询OR a.contactid = d.contactid的位,则查询只需不到一秒钟。

如果他们同时在联系人列表中,或者直接添加,我真的需要查询来返回总的contactid。

任何人都知道为什么OR部分查询会添加如此多的额外处理时间,因为a中只有1行且contactid为null。

以下是对查询的解释:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  a   ref customerid,contactid    customerid  4   const   1    
1   SIMPLE  b   eq_ref  PRIMARY,listID  PRIMARY 8   a.calllistid    1   Using index
1   SIMPLE  c   ref listID  listID  4   b.listID    156  
1   SIMPLE  d   ref PRIMARY,customerid  customerid  5   const   57409   Using where

1 个答案:

答案 0 :(得分:0)

尝试联合所有而不是OR。

它很乱,你将不得不几乎复制查询,但可能运行得更快。尝试这样的事情:

选择总和(q.tot) 来自( SELECT COUNT(d.contactid)AS tot 来自todo_contacts a     LEFT JOIN联系人列表b ON a.calllistid = b.listid     LEFT JOIN contact_list_relationship c ON c.listid = b.listid     INNER JOIN联系人d ON(d.contactid = c.contactid)AND d.customerid ='100'

联合所有

SELECT COUNT(d.contactid)AS tot 来自todo_contacts a     INNER JOIN联系人d ON(a.contactid = d.contactid)AND d.customerid ='100'

WHERE a.customerid ='100')q