LEFT JOIN和COUNT两个查询的区别

时间:2016-08-09 10:08:37

标签: mysql sql join left-join

我的mysql数据库服务和关系中有两个表我只需要计算关系表中有多少服务,所以我想这样做

我的桌子:

  • 人际关系 - | relation_id | parent_id |
  • 服务 - | service_id | slug_title | title |

代码:

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

两个查询都返回相同的结果,并且正在按照我的需要运行,但哪个更好或者更好地以更好的性能方式使用?

2 个答案:

答案 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友好的事情,因为我知道。