例如一张表sales ,有300w条数据,记录的订单编号,订单客户,订单时间。
假设本人想统计这个星期的订单量,本人先统计好每天的相加就行了。
但是本人想统计这个星期的下单人数,只能去sales 取数据,不能像订单量一样相加。
问一下这种统计应该怎么优化。原因是需要统计当月的,当年的,而且几分钟刷新一次。
假设本人想统计这个星期的订单量,本人先统计好每天的相加就行了。
但是本人想统计这个星期的下单人数,只能去sales 取数据,不能像订单量一样相加。
问一下这种统计应该怎么优化。原因是需要统计当月的,当年的,而且几分钟刷新一次。
解决方案
40
做一个模拟materialized view
按照你需要统计的最小单位,例如周或月,定期更新增量
replace into monthly_user_id_mv
select year(order_date) * 100 + month(order_date) mth, user_id
from sales
where order_date between str_to_date(“2016-04-01”, “%Y-%m-%d”) and str_to_date(“2016-04-30”, “%Y-%m-%d”);
剩下的就快了
select count(distinct user_id)
from mv
where mth between 201501 and 201512;
假如需要更快,可以再做一个年版的mv。
假如需要精确到当时的每个人,可以再加一个sales统计增量数据的delta。
按照你需要统计的最小单位,例如周或月,定期更新增量
replace into monthly_user_id_mv
select year(order_date) * 100 + month(order_date) mth, user_id
from sales
where order_date between str_to_date(“2016-04-01”, “%Y-%m-%d”) and str_to_date(“2016-04-30”, “%Y-%m-%d”);
剩下的就快了
select count(distinct user_id)
from mv
where mth between 201501 and 201512;
假如需要更快,可以再做一个年版的mv。
假如需要精确到当时的每个人,可以再加一个sales统计增量数据的delta。