背景:
我在我的小公司里“继承了”一个PHP webapp
经过多年的唠叨终于得到了
去扔掉意大利面条代码然后重新开始.
我们想记录系统中的每个操作,例如:
>用户X查看了项目Y.
>用户X更新了项目Y.
>城市Z上的新项目Y.
然后提供不同分辨率(日,月,年)的图表
在系统中完成的操作.
在之前的版本中,我们有一张表,其中有20,000,000条记录
2005年,这将让您了解我们已经拥有的大量数据
有,这只是众多统计数据之一.
实际问题:
您建立近实时的建议
系统创建此统计信息?
笔记:
>图形已经通过谷歌的可视化API覆盖
>我不习惯使用任何Nosql数据库或
消息服务器,crons或其他任何东西
完成的工作,但更喜欢mysql / PHP
解
>我目前的思路是
自动为每个创建一个表
统计我要保存,并创建
几个聚合表(按月,按天,按年)
缓存结果.
>我知道这是一个广泛的问题,但欢迎任何建议
解决方法:
USERS TABLE OBJECTS TABLE
--------------- -----------------
user_id (primary) object_id (primary)
USERS_TO_OBJECTS TABLE
--------------------
user_id (index)
object_id (index)
time (index)
action (index)
? object_type (index) // Could be useful to speed things up
此设置可能会在绘制图表时为您提供最大的灵活性,并且也可以非常快,因为如果您不需要它们,可以省略用户或对象.
编辑:
假设城市X(id 9876)由用户123(id 1234)更新…
1234 - user_id (the user that did the action)
9876 - object_id (the object where the action was done)
xyz - time
updated - action type (so that you select only specific actions)
city - object type (so that you select only specific objects)
我用40M行填充了这个表,结果非常可接受.
对于上一周的UPDATED城市数量的简单COUNT,为0.002秒.随机插入数据.
编辑2
如果你发现自己有一个非常庞大的表,你可以使用MysqL分区,你的架构是完美的.我真的不知道你将如何使用这些表,但你可以:
按范围划分.在日期上组织分区.每个新的一个月左右你都会有一个新的分区.
按键分区.按操作组织分区.每个动作都进入正确的分区.
您可以查看more on partitions on MySQL’s site和this article gives you some detail到精细分区.