2014-03-01 47 views
1

我遇到此查詢的問題。這太耗時了。多次加入時間過長

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可以聯繫的ContactID直接相關的觸點表或contactlistid與所述contactlists表。

這個問題真的好像是這個。如果我在contact_list_relationship(其中存儲聯繫人列表&聯繫人之間的關係)中的聯繫人列表具有50,000個關係的contactlistid中插入1行到todo_contacts,則查詢非常慢(花費幾分鐘)。如果刪除查詢OR a.contactid = d.contactid的位,查詢時間不到一秒鐘。

我真的需要這個查詢來返回一個聯繫人的總數,如果他們都在聯繫人列表中,或者直接添加。

任何人都知道爲什麼該查詢的OR部分增加了很多額外的處理時間,因爲考慮到a中只有一行並且contactid爲空。

下面是對查詢解釋:

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

嘗試UNION ALL代替OR的。

它很混亂,你將不得不幾乎重複查詢,但可能會運行得更快。嘗試是這樣的:

選擇總和(q.tot) 從( SELECT COUNT(d.contactid)AS TOT FROM todo_contacts一個 LEFT JOIN contactlists B關於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'

UNION ALL

SELECT COUNT(d.contactid)AS tot FROM todo_contacts a INNER JOIN觸點D ON(a.contactid = d.contactid)AND d.customerid = '100'

WHERE a.customerid = '100')●

+0

感謝您的回答。我忘了把DISTINCT放在最初的問題中,這是必要的。由於重複,我無法將2個查詢添加到一起。 – Michael

+0

我結束了分裂,並在結合後使用了帶有「DISTINCT」的「COUNT」。謝謝! – Michael