|
原帖由 fan0124 于 2010-1-12 14:25 发表 ![]()
newid,你说到中间表弄到独立的库去,那就是基础表和中间表进行分离了是吧。但是这样我对基础表进行的统计,然后统计一次后的数据再到另外的库(假设为B)插入
到中间表中,这样会不会降低性能呢。这两天对表又进行了修改,针对业务需求,发现有几个问题好像需要再进一步改变思路才行,有点不解。
1、如果我把中间表、基础表放到两个独立的库中,(先暂且不考虑分布式的架构,读写分离),如果我对基础表统计好了后,再插入到另外的库中的统计表,性能会不会
影响很大。因为我的中间表有17张表,也就是说每次我要统计都要写入17张表,会不会因为数据多而造成性能的问题。
2、先前也说到过物化视图,包括用快速刷新的物化视图,我之前也是想的每天定时触发JOB来完成计算统计,让结果先冗余起来,甚至每天24小时中每半小时触发一次J
OB来完成统计计算。但是业务需求说是“实时统计”,按照网站的实际访问次数的多少来决定JOB的执行次数
比如:网站A今天一天被访问了1000次,那么我在每次访问结束后就要执行一次JOB来进行网站访问的流量统计,然后数据放到17张中间表中,一天是1000次,意味着
要触发1000次,这样岂不是根本不能用快速刷新的物化视图了,因为不可能是定时触发的。我觉得这样是不是表的设计还需要加上什么策略,我觉得就表结构,基础表加
中间表应该是没什么问题吧,但是觉得好像性能上有很大的考验吧,实时的触发的。
3、在触发JOB进行每次统计时,还需要过滤数据,也就是过滤的条件,目前是有三个
屏蔽的URL、屏蔽的域名、屏蔽的IP段
也就是说每次从基础表进行数据统计到中间表的时候,要从这三个表取出对应的数据,将符合其中的数据过滤掉,这样对查询貌似又有性能上的要求了,通过分区加索引
能解决好吗
4、如果就只有通过条件进行数据的过滤进行统计也还好,但是如果某一天这个过滤条件去掉了,那之前的数据要求要重新统计,那我中间表岂不是每天的数据都要重新
统计了。怎么弄呢中间表。
比如:我今天设置了屏蔽的URL有三个,屏蔽的域名有5个,屏蔽的IP段从某一段到某一段,然后这样每天统计数据(加了这些过滤条件的),20天后,我把这些屏蔽
的设置给去掉了,这样到第21天的时候,统计的数据是不加过滤条件的(因为没有屏蔽的设置了),但是前20天的数据也要在去掉屏蔽设置后重新统计。这意味着我要
对前20天每天的统计数据重新计算了,这样中间表如何设计好呢?性能开销这样也太大了吧。如果是40天,50天,那还了得。
5、我有没有必要加上对每个周进行一次统计的中间表,基于3,4点中的考虑
1. 我上次说的把中间表放到独立的库,是因为你说中间表是和原始表一模一样的拷贝,你只是为了把负载分离出来。
如果你这个“中间表”是更高层次的统计数据,不应该分库。
2. 实时触发的不现实,这意味着你的并发插入全部会变成串行插入,因为大家都要更新同一个统计条目(假设你一个网站一天有一条统计数据)
你必须修改业务需求,允许统计数据有延迟。实际应用中这个延迟根本不要紧,很多用户甚至只需要截至前一天的数据。
3. 你的过滤条件是活的,不可能按过滤条件分区。索引没什么用,因为被过滤掉的毕竟是少数。
4. 无法用中间表,这相当于即兴查询,只能查原始数据。
5. 如果用中间表,意味着历史数据不可修改,不能用今天的过滤条件来套用过去的数据。只能够修改需求,接受“过去的统计数据基于过去的过滤条件”这样的事实。 |
|