我遇到此查詢的問題。這太耗時了。多次加入時間過長
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
感謝您的回答。我忘了把DISTINCT放在最初的問題中,這是必要的。由於重複,我無法將2個查詢添加到一起。 – Michael
我結束了分裂,並在結合後使用了帶有「DISTINCT」的「COUNT」。謝謝! – Michael