2016-12-31 66 views
0

我想知道使用「IN」限制與其中的很多值有什麼缺點。單個查詢VS多個查詢:執行時間和資源使用

SELECT count(*), mail 
FROM event, contacts 
WHERE event.contactid = contacts.id 
AND event_type = 1 
AND mail IN (@1, @2, @3, etc.) 
GROUP BY mail; 

另外,你認爲將這些查詢拆分成多個並行執行的查詢會更好嗎?與第一種解決方案相比,資源使用和執行時間(例如)會帶來什麼後果?

在此先感謝

回答

4

切勿將FROM子句中使用逗號。 始終使用使用正確的,明確的JOIN語法。

資格列名和使用表別名:

SELECT count(*), c.mail -- I am guessing `mail` comes from `contacts` 
FROM event e JOIN 
    contacts c 
    ON e.contactid = c.id 
WHERE e.event_type = 1 AND 
     c.mail IN (@1, @2, @3, etc.) 
GROUP BY c.mail; 

沒有缺點具有大IN列表(當然,在合理範圍內 - 在某些時候,你可能會碰到查詢長度的限制)。事實上,當常量用於IN列表時,MySQL有一個很好的優化。它對列表進行排序並對值進行二分搜索。

這就是說,如果列表來自另一個表/查詢,那麼你不應該把它們作爲常量。相反,您應該將表/查詢合併到此查詢中。