单个查询VS多个查询:执行时间和资源使用情况

时间:2016-12-31 15:49:04

标签: mysql sql

我想知道使用带有很多值的“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;

另外,您认为将这些查询拆分为多个并行执行的查询会更好吗?与第一个解决方案相比,资源使用和执行时间(例如)会产生什么后果?

提前致谢

1 个答案:

答案 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有一个很好的优化。它对列表进行排序,并对值进行二进制搜索。

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