mySQL Performant请求在另一个请求的每一行的列中发出计数请求

时间:2009-05-15 22:48:05

标签: sql mysql

我有一张桌子上有设备,他们买的国家和他们买的日期。 我想要检索: - 按国家/地区划分的设备总数 - 以及每个国家自1个月以来购买的设备数量。

我使用此请求来实现此目的:

SELECT countryCode, COUNT(*) AS sinceBeginning, (
SELECT COUNT(*) 
FROM mytable 
WHERE countryCode = table1.countryCode
AND buyedDate >= DATE_SUB( CURDATE( ) , INTERVAL 1 MONTH )
) AS sinceOneMonth
FROM mytable AS table1
GROUP BY countryCode
ORDER BY countryCode ASC";

但是每行的“sinceOneMonth”列的内部计数对于性能来说非常昂贵。 有没有办法让这个要求更好? 感谢。

3 个答案:

答案 0 :(得分:1)

您的效果可能会因国家代码和buyeddate的综合索引而提高,如果您在未传递国家代码的情况下也不会直接查询buyeddate,那么您可以删除国家/地区代码上的索引并将其替换为复合索引。

以下查询可能表现更好,但不一定如此,它依赖于您的数据模式。

SELECT countrycode, 
       SUM(in_month) AS this_month, 
       COUNT(*)      AS all_time
FROM  ( 
         SELECT countrycode, 
                buyedDate >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH) AS in_month 
         FROM mytable
      ) AS summary 
GROUP BY countrycode;

答案 1 :(得分:0)

(countrycode,buyedDate)上是否有索引?

编辑:随着史蒂夫·韦特的询问进一步简化:

SELECT 
  countrycode
, SUM(buyedDate >= DATE_SUB(CURDATE(), INTERVAL 1 MONTH)) AS this_month
, COUNT(*) AS all_time
FROM  mytable
GROUP BY countrycode

答案 2 :(得分:0)

谢谢Steve和Andomar,

请求:

  

SELECT countrycode,COUNT(*)AS sinceBeginning,SUM(buyedDate> = DATE_SUB(CURDATE(),INTERVAL 1   MONTH))ASOneMonth   来自mytable   WHERE model = 1   GROUP BY国家代码;

性能更好:原始请求需要4秒,现在为2秒。 测试结果: countrycode自从上个月开始 1 500101 20184 表中有600.000行