【问题标题】:LEFT JOIN and COUNT two queries differenceLEFT JOIN 和 COUNT 两个查询的区别
【发布时间】:2016-08-09 10:08:37
【问题描述】:

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

我的桌子:

  • 关系- |关系ID | parent_id |
  • 服务- |服务标识 |蛞蝓标题 |标题 |

代码:

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

两个查询都返回相同的结果,并且按照我的需要工作,但哪个更好或更适合以​​更好的性能方式使用?

【问题讨论】:

  • 我会选择第一个,避免你在第二个中使用的内联视图(“关系”)
  • 请注意,查询 1 的 GROUP BY 无效,不会在较新的 MySQL 版本上执行。
  • 你能解释一下原因吗?

标签: mysql sql join left-join


【解决方案1】:

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 结果进行聚合。

我应该指出,在理智上,我更喜欢第一个版本,因为我认为它是您想要的结果的最清晰的陈述。但是,相关子查询也很清晰,可以有更好的性能。

【讨论】:

  • 我会尝试使用您的查询,感谢您的详细解释。
【解决方案2】:

我认为您应该使用第一个查询。据我所知,在左连接语句中使用子查询不是处理器和内存友好的事情。

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 2019-05-03
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多