WebApp的PHP和MySQL统计报告的推荐

背景:

我在我的小公司里“继承了”一个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 sitethis article gives you some detail到精细分区.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...