mysql - 使用 count(*) 和 inner join 时查询速度慢

标签 mysql sql join group-by query-optimization

我的查询运行大约需要 5 秒。它返回近 5000 条记录。

SELECT 
    c.CompanyID, 
    c.CompanyName, 
    psr.PartnerSRFName, 
    psr.PartnerSRLName, 
    be.MonthlyFee, 
    (
        SELECT Count(*) 
        FROM Units
        INNER JOIN Properties ON Units.PropertyID = Properties.PropertyID
        WHERE Properties.CompanyID = c.CompanyID
    ) TotalUnits
FROM Company c
LEFT JOIN Partner_SalesRep_CompanyMap psrcm ON c.CompanyID = psrcm.CompanyID
LEFT JOIN Partner_SalesReps psr ON psrcm.Partner_SalesRepsID = psr.AssignedID
LEFT JOIN Billing_Exemption be ON be.CompanyID = c.CompanyID
WHERE c.LeadSourceCompanyID = 1 AND Active = 1

如果我删除 Select Count(*) ...,它运行得非常快,但我需要这些数据。有没有办法改进这个查询?

谢谢

最佳答案

Gordon Linoff 推荐的索引是必备的。

您可以做的另一件事是将计算从内联查询移动到连接子查询。这可能允许 RDBMS 优化查询,因为现在明确不需要为每条记录重复计算(只有 CompanyID 的不同值实际上有所不同):

SELECT 
    c.CompanyID, 
    c.CompanyName, 
    psr.PartnerSRFName, 
    psr.PartnerSRLName, 
    be.MonthlyFee, 
    COALESCE(x.TotalUnits, 0) TotalUnits
FROM Company c
LEFT JOIN Partner_SalesRep_CompanyMap psrcm ON c.CompanyID = psrcm.CompanyID
LEFT JOIN Partner_SalesReps psr ON psrcm.Partner_SalesRepsID = psr.AssignedID
LEFT JOIN Billing_Exemption be ON be.CompanyID = c.CompanyID
LEFT JOIN (
    SELECT Properties.CompanyID, COUNT(*) TotalUnits
    FROM Units
    INNER JOIN Properties ON Units.PropertyID = Properties.PropertyID
    GROUP BY Properties.CompanyID
) x ON x.CompanyID = c.CompanyID
WHERE c.LeadSourceCompanyID = 1 AND Active = 1

另一种选择是将子查询与外部查询合并(通过向外部查询添加更多连接),在整个外部查询上打开聚合,并在表 UnitsProperties 进行计数。我不太喜欢这个,因为通常情况下,您汇总得越早,效率就越高。

关于mysql - 使用 count(*) 和 inner join 时查询速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54991339/

相关文章:

PHP 将表单响应插入到单独的 MySQL 表/行中

mysql - 数据库和 Hibernate 一对一的最佳方法

mysql - 链接 MySQL 表中的行

mysql - CakePHP-SQL : joining tables

mysql - INSTR() 和 GROUP_CONCAT() 在服务器之间返回不同的结果

php - 针对数据库问题的查询效率

mysql - 连接两个 SQL 查询

php - 访问另一个 PHP 文件中的 POST 变量

java - 根据servlet中当前位置获取附近的纬度和经度

java - Derby 中的sql错误 - ERROR 42X01 : Syntax error: Encountered “WHERE”