大型表的MySQL最佳实践
我需要帮助,伙计们。我不是db专家,我会努力学习 (一) 我有一个有45列和100米记录的表格。(每小时增加约100万) 我需要从这个表生成报告。当行数只有几百行时,我的查询是这样的,运行得很好:大型表的MySQL最佳实践,mysql,sql,performance,amazon-rds,Mysql,Sql,Performance,Amazon Rds,我需要帮助,伙计们。我不是db专家,我会努力学习 (一) 我有一个有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,
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;
选择
作为imp计数(当'imp'时为案例事件类型,然后为1,否则为空结束),
按单击次数计数(单击时的案例事件类型,然后为1,否则为空结束),
计数(当“pc事件”时的案例事件类型,然后是1个ELSE NULL END)作为post点击事件,
计数(当'pv_conv'时为案例事件类型,然后为1 ELSE NULL END)作为post_view_conv,
作为记账收入的总额(记账收入美元),
修剪(站点\域)作为站点\域,
活动编号
从…起
法学学士学位标准
哪里
`datetime`>='2014-05-10 00:00:00'和'datetime`100;
我为datetime
对于大多数报告,只有分组依据
零件更改
那么如何改进查询?
(二)
我现在正在使用RDS(m3.large)并计划切换到红移你认为现在的做法正确吗?
多谢各位
编辑:
以下是解释的结果:
使用索引,您的查询的效率与您在MySQL中的查询效率差不多。挑战是每天要聚集2400万行。MySQL在聚合方面不是很有效,正如解释计划中使用的“文件排序”所指出的那样
如果你处理数据的日子,那么你应该考虑一个分区方案,所以每个数据都存储在它自己的分区中。查看更多。这可能会使数据的获取速度加快一点,但实时接收器是
group by
。任何可以用来减少聚合行数的方法都会加快聚合速度
关于切换到红移的问题更多的是基于观点,所以我将给出一个简短的、个人的回答。根据我使用RedShift的经验,我对它的性能印象深刻,并且认为它可以很好地用于您的查询。使用索引,您的查询的效率与您在MySQL中的查询效率差不多。挑战是每天要聚集2400万行。MySQL在聚合方面不是很有效,正如解释计划中使用的“文件排序”所指出的那样
如果你处理数据的日子,那么你应该考虑一个分区方案,所以每个数据都存储在它自己的分区中。查看更多。这可能会使数据的获取速度加快一点,但实时接收器是
group by
。任何可以用来减少聚合行数的方法都会加快聚合速度
关于切换到红移的问题更多的是基于观点,所以我将给出一个简短的、个人的回答。根据我使用RedShift的经验,我对它的性能印象深刻,并且认为它可以很好地用于您的查询。使用索引,您的查询的效率与您在MySQL中的查询效率差不多。挑战是每天要聚集2400万行。MySQL在聚合方面不是很有效,正如解释计划中使用的“文件排序”所指出的那样
如果你处理数据的日子,那么你应该考虑一个分区方案,所以每个数据都存储在它自己的分区中。查看更多。这可能会使数据的获取速度加快一点,但实时接收器是
group by
。任何可以用来减少聚合行数的方法都会加快聚合速度
关于切换到红移的问题更多的是基于观点,所以我将给出一个简短的、个人的回答。根据我使用RedShift的经验,我对它的性能印象深刻,并且认为它可以很好地用于您的查询。使用索引,您的查询的效率与您在MySQL中的查询效率差不多。挑战是每天要聚集2400万行。MySQL在聚合方面不是很有效,正如解释计划中使用的“文件排序”所指出的那样
如果你处理数据的日子,那么你应该考虑一个分区方案,所以每个数据都存储在它自己的分区中。查看更多。这可能会使数据的获取速度加快一点,但实时接收器是
group by
。任何可以用来减少聚合行数的方法都会加快聚合速度
关于切换到红移的问题更多的是基于观点,所以我将给出一个简短的、个人的回答。根据我使用RedShift的经验,我对它的性能印象深刻,认为它可以很好地用于您的查询。您只是插入或同时更新数据库,这是“主”查询还是众多查询中的一个?@JoachimIsaksson没有更新,只有插入。@JoachimIsaksson这是众多查询中的一个,但对于大多数其他查询,只有“group by”部分更改。@我添加了EXPLAIN的结果。据我所知,按计算字段(站点\域)分组是您最大的问题。有没有办法在插入值之前而不是在查询中对其进行修剪?您是否只插入或同时更新数据库,这是“主”字段“查询还是众多内容中的一个?@JoachimIsaksson没有更新,只有插入。@JoachimIsaksson这是众多内容中的一个,但对于大多数其他内容,只有“分组依据”部分发生了更改。@我添加了解释的结果。据我所知,按计算字段(站点\域)分组是您最大的问题。有没有办法在插入值而不是在查询中插入值之前对其进行修剪?您只是插入或同时更新数据库,这是“主”查询还是众多查询中的一个?@JoachimIsaksson无更新,仅插入。@JoachimIsaksson这是众多查询中的一个,但对于大多数其他查询,只有“分组依据”部分更改。我添加了解释的结果。据我所知,按计算字段(站点\域)分组是您最大的问题。在插入值之前,是否有任何方法修剪该值