2016-12-31 67 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有一个很好的优化。它对列表进行排序并对值进行二分搜索。

这就是说,如果列表来自另一个表/查询,那么你不应该把它们作为常量。相反,您应该将表/查询合并到此查询中。