[英]MySQL best practices for huge table
我需要帮助的人。 我不是数据库专家,请尝试学习。
1)
我有一个包含45列和1亿条记录的表。 (每小时增加约一百万),我需要从该表生成报告。 当行数只有几百时,我的查询就是这样,并且运行良好:
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的结果:
使用索引,查询的效率与在MySQL中的效率差不多。 挑战是每天总计2400万行。 正如解释计划中“ filesort”的使用所指出的那样,MySQL在聚合方面并不是很有效。
如果要处理几天的数据,则应考虑使用分区方案,因此每个数据都存储在其自己的分区中。 在这里查看更多。 这可能会使数据的获取更快一些,但是实时接收器为group by
。 您可以使用任何减少聚合行数的方法来加快速度。
切换到RedShift的问题更多基于观点,因此我将给出一个简短的个人答案。 根据我对RedShift的经验,该性能给我留下了深刻的印象,并认为它可以很好地用于您的查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.