假设我的模型包含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/