需要在过去5个月内从表中找到COUNT OF唯一身份用户帐户,此表包含数百万个数据。
select COUNT(distinct(account)) as total_unique,
COUNT(distinct(IF( Column1!=0 OR Column2!=0, account, null)))
from table_name where date(event_date) >= date('2014-04-01') and date(event_date) <=date('2014-08-31');
此查询目前耗时超过10分钟才能获取数据。 我们在“event_date”列和此表中的“account”列上都有索引。 我们使用mysql作为DB。 你能帮帮我们吗?
答案 0 :(得分:3)
在您的查询中,由于eventdate colomn上的日期函数
,因此无法使用索引WHERE eventdate BETWEEN CAST('2014-04-01' AS DATE)
AND CAST('2014-09-01' AS DATE) - INTERVAL 1 SECOND
您将获得相同的结果,但现在将使用索引范围扫描。
或者作为ypercube在他的评论中说明
WHERE eventdate >= CAST('2014-04-01' AS DATE)
AND eventdate < CAST('2014-09-01' AS DATE)
答案 1 :(得分:-1)
如果每个重复的帐户记录的column1和column2相同,则应考虑在派生表中粘贴帐户column1和column2的SELECT和GROUP BY。这将有助于Count
的昂贵任务,并将删除真正昂贵的Count(Distinct())
SELECT
Count(a.Account) AS total_unique,
SUM(CASE WHEN a.column1 <> 0 or a.column2 <> 0 THEN 1 ELSE 0 END)
FROM
(
SELECT account, column1, column2
FROM table_name GROUP BY 1,2,3
WHERE
DATE (event_date) >= DATE ('2014-04-01') AND
DATE (event_date) <= DATE ('2014-08-31')) as a
);