我遇到了此查询的问题。这花了太长时间。
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
答案 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