MySQL表格的最佳实践

时间:2014-05-24 12:47:42

标签: mysql sql performance amazon-rds

我需要帮助的人。我不是数据库专家,并尝试学习。

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的结果: EXPLAIN

1 个答案:

答案 0 :(得分:3)

使用索引,您的查询与MySQL中的查询一样高效。挑战是每天聚合2400万行。正如在解释计划中使用“filesort”所指出的那样,MySQL在聚合方面效率并不高。

如果您正在处理数天的数据,那么您应该考虑分区方案,因此每个数据都存储在自己的分区中。查看更多here。这可能会使数据的获取速度更快,但实时接收器是group by。您可以使用任何方法来减少聚合的行数,这样可以加快速度。

关于切换到RedShift的问题更多是基于意见的,所以我将给出简短的个人答案。根据我使用RedShift的经验,我对性能印象深刻,并认为它可以很好地解决您的问题。