我想知道使用带有很多值的“IN”限制的缺点是什么。
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;
另外,您认为将这些查询拆分为多个并行执行的查询会更好吗?与第一个解决方案相比,资源使用和执行时间(例如)会产生什么后果?
提前致谢
答案 0 :(得分: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有一个很好的优化。它对列表进行排序,并对值进行二进制搜索。
也就是说,如果列表来自另一个表/查询,那么你不应该把它们作为常量放入。相反,您应该将表/查询合并到此查询中。