需要优化下面的mysql查询

时间:2014-10-06 13:14:13

标签: mysql performance

需要在过去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。 你能帮帮我们吗?

2 个答案:

答案 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
   );