大型表的MySQL最佳实践

大型表的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,

我需要帮助,伙计们。我不是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, 
    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这是众多查询中的一个,但对于大多数其他查询,只有“分组依据”部分更改。我添加了解释的结果。据我所知,按计算字段(站点\域)分组是您最大的问题。在插入值之前,是否有任何方法修剪该值