最近做项目遇到这样一个数据库问题:在后台查询里面需要实时查询到用户动作统计,比如多少用户访问了当前页面,多少用户分享了当前页面,在页面上停留了多少时间等。我开始设计数据库的时候,只设计了一个『动作』表,里面有详细的动作分类与动作时间,只要有了数据,后面的查询是比较容易的事情。
但是我错了,错误的原因是数据量非常的庞大,然后后台每执行一次查询要耗费10S以上,占用大量CPU时间,对前台用户访问也会造成问题。于是我武断的把后台的查询设定为非实时,即每天跑一次数据,导出一次报表
但用户不接受,所一定要实时的看到数据,我解释了原因,并且说并没有做实时的统计,如果非要实时查看对整个系统都会有影响,会影响到用户的体验,但客户坚持说一定要看到实时的统计。
其实我知道还有一种实时的统计方式,即将统计的数据设计成冗余字段,在记录用户访问动作的时候,将这些数据加总。但这样我总是会担心出现数据不一致的问题,因为『动作』表里面记录是准确的,但数据表里面可能由于网络访问,程序异常等原因加总不能与『动作』匹配,但无奈用户坚持这样的要求,我只好这样做
这样做的效果却出奇的好,因为计算的时间平均分配到了每个用户的头上,不会每次做批量计算对CPU压力,而且最关键的是客户可以实时检测到用户的数据了!
针对以上,同样可以用到我对『印象笔记』的整理上来。我原来的想法是心可能多的收集资料,然后找一个时间把这些资料分门别类的整理起来。但后来一直没有找到这个时间,所以『印象笔记』里面现在是一团糟的状态!
于是我现在就想,如果我每次找到灵感的时候,稍微做一下归类或者设置一个标签,就会让笔记非常的容易查找!就像我当年使用Google Note做归类一样,当时的归类让我几年后遇到问题还会想到里面记录的东西,好找与不好找差别确实非常的大!
这就是,把一件可能非常耗费时间的事情平均分配到每次里面,所做的工作非常少,但得到的效果却是非常好。以前是全部塞进去,再次用到这个资料的时候我基本上还是去Google,因为没有分类,我不知道要在哪里去找。但如果已经做了分类,查找进来就非常方便了,比如我要查找mysql的知识,只需要找到这个目录,搜索关键字就可以了!再说现在每个目录的数据非常少,基本浏览一下就能找到自己需要的信息了。另外平时在没事的时候,还可以复习里面的知识,把东西记住就会在写代码的时候节省很多的时间!