组运行的mysql计数非常慢

时间:2016-02-24 22:13:51

标签: mysql performance count

我有以下表格 awarded_companiestendersgrants

有2对多对多关系

  1. awarded_companies <-> tenders
  2. awarded_companies <-> grants
  3. 我想列出所有属于招标的获奖公司。

    所以查询看起来像这样:

    SELECT awarded_companies.*
    FROM awarded_companies
    JOIN awarded_company_tenders ON (awarded_company_tenders.awarded_company_id = awarded_companies.id)
    GROUP BY awarded_companies.id
    

    实际上我有大量的记录,需要对结果进行分页。当我尝试计算属于awarded_companies的所有tender时,查询需要30秒。

    以下是计算行和EXPLAIN EXTENDED的两种方法的基准:

    1. Count with subquery
    2. Count distinct
    3. 我唯一可以提出的是向awarded_companies添加2个标志 - 一个用于判断该公司是否属于tender,另一个用于判断该公司是否属于grant 1}}。

      这样我就可以删除joingroup by,查询将如下所示:

      SELECT * FROM awarded_companies WHERE has_tender=1

      任何人都可以帮我吗?

4 个答案:

答案 0 :(得分:0)

SELECT count(awards_companies.id) 来自award_companies JOIN awards_company_tenders ON(granted_company_tenders.awarded_company_id = awards_companies.id) GROUP BY award_companies.id

答案 1 :(得分:0)

只是一个建议。从'award_company_tenders&#39;直接选择计数是否存在任何逻辑问题。我们必须从'award_companies&#39;并加入“award_company_tenders&#39;寻找计数。

答案 2 :(得分:0)

SELECT  *
    FROM  awarded_companies AS ac
    WHERE  EXISTS 
      ( SELECT  *
            FROM  awarded_company_tenders
            WHERE  awarded_company_id = ac.id 
      ) 

注意:通过避免JOIN(分解了行数),可以避免GROUP BY(内爆)。

答案 3 :(得分:0)

我添加了2个标记,查询运行速度非常快。

感谢大家的评论。