我有一张桌子上有设备,他们买的国家和他们买的日期。 我想要检索: - 按国家/地区划分的设备总数 - 以及每个国家自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”列的内部计数对于性能来说非常昂贵。 有没有办法让这个要求更好? 感谢。
答案 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行