我需要帮助的人。我不是数据库专家,并尝试学习。
1)
我有一个包含45列和100米记录的表。 (每小时增加约100万) 我需要从此表生成报告。当行数只有几百行时,我的查询就像这样并且工作得很好:
SELECT
COUNT(CASE EVENT_TYPE WHEN 'imp' THEN 1 ELSE NULL END) as imps,
COUNT(CASE EVENT_TYPE WHEN 'click' THEN 1 ELSE NULL END) as clicks,
COUNT(CASE EVENT_TYPE WHEN 'pc_conv' THEN 1 ELSE NULL END) as post_click_convs,
COUNT(CASE EVENT_TYPE WHEN 'pv_conv' THEN 1 ELSE NULL END) as post_view_convs,
SUM(booked_revenue_dollars) as booked_revenue,
TRIM(site_domain) as site_domain,
campaign_id
FROM
lld_standards
WHERE
`datetime` >= '2014-05-10 00:00:00' AND `datetime` <= '2014-05-10 23:59:00'
GROUP BY
campaign_id,
site_domain
HAVING
COUNT(CASE EVENT_TYPE WHEN 'imp' THEN 1 ELSE NULL END) > 100;
我为datetime
创建了索引
对于大多数报告,只有GROUP BY
部分更改。
那么如何改进查询?
2)
我现在正在使用RDS(m3.large)并计划切换到Redshift。 你认为现在是正确的举动吗?
谢谢。
修改
以下是EXPLAIN的结果:
答案 0 :(得分:3)
使用索引,您的查询与MySQL中的查询一样高效。挑战是每天聚合2400万行。正如在解释计划中使用“filesort”所指出的那样,MySQL在聚合方面效率并不高。
如果您正在处理数天的数据,那么您应该考虑分区方案,因此每个数据都存储在自己的分区中。查看更多here。这可能会使数据的获取速度更快,但实时接收器是group by
。您可以使用任何方法来减少聚合的行数,这样可以加快速度。
关于切换到RedShift的问题更多是基于意见的,所以我将给出简短的个人答案。根据我使用RedShift的经验,我对性能印象深刻,并认为它可以很好地解决您的问题。