假设我的模型包含2个表格:人员和地址。一个人可以有O个,1个或多个地址。我正在尝试执行一个查询,该查询列出所有人员并包括他们分别拥有的地址数。这是我必须实现的两个查询:

SELECT
  persons.*,
  count(addresses.id) AS number_of_addresses
FROM `persons`
  LEFT JOIN addresses ON persons.id = addresses.person_id
GROUP BY persons.id




SELECT
  persons.*,
  (SELECT COUNT(*)
   FROM addresses
   WHERE addresses.person_id = persons.id) AS number_of_addresses
FROM `persons`


我想知道在性能方面是否一个比另一个更好。

最佳答案

确定性能特征的方法是实际运行查询并查看哪个更好。

如果没有索引,则第一个可能更好。如果在addresses(person_id)上有索引,则第二个可能更好。

原因有点复杂。根本原因是group by(在MySQL中)使用排序。并且,排序的复杂度为O(n * log(n))。因此,执行排序的时间比数据增长的更快(不是快很多,但是有点快)。结果是,在所有数据上,每个人的一堆聚合要比每个人的一个聚合快。

那是概念上的。实际上,MySQL会将索引用于相关子查询,因此它通常比不使用索引的整体group by更快。

关于mysql - 连接vs子查询对嵌套对象进行计数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38187550/

10-09 06:08