我的mysql数据库服务和关系中有两个表我只需要计算关系表中有多少服务,所以我想这样做
我的桌子:
代码:
SELECT
services.slug_title,
services.title,
COUNT(relationships.parent_id) AS num_companies
FROM
services
LEFT JOIN
relationships ON services.service_id = relationships.parent_id
GROUP BY
services.service_id
ORDER BY
services.title ASC
我还有另一个查询
SELECT
services.slug_title,
services.title,
COALESCE(companies, 0) AS num_companies
FROM
services
LEFT JOIN
(SELECT
parent_id, COUNT(*) AS companies
FROM
relationships
GROUP BY
parent_id) relationships ON services.service_id = relationships.parent_id
ORDER BY
services.title ASC
两个查询都返回相同的结果,并且正在按照我的需要运行,但哪个更好或者更好地以更好的性能方式使用?
答案 0 :(得分:2)
FROM
子句中的子查询会阻碍MySQL的性能,因为它们会阻止索引的使用。这表明偏好第一个版本。
但是,你应该考虑这个版本:
SELECT s.slug_title, s.title,
(SELECT COUNT(*) FROM relationships r WHERE s.service_id = r.parent_id
) AS num_companies
FROM services s
ORDER BY s.title ASC;
子查询具有更好的性能似乎是违反直觉的。但是,此查询可以利用relationships(parent_id)
和services(title, parent_id)
(甚至services(title, service_id, slug_title)
上的索引。并且,不必对较大的中间JOIN
进行聚合结果
我应该注意到,从理智上讲,我更喜欢第一个版本,因为我认为这是你想要的最清晰的结果陈述。但是,相关子查询也非常清晰,可以有更好的性能。
答案 1 :(得分:0)
我认为你应该使用第一个查询。在左连接语句中使用子查询不是处理器和ram友好的事情,因为我知道。