存储性能数据以进行统计的最佳方式(图表)

Optimal way of storing performance data for statistics (graphs)

目前我正在 PHP/MySQL 的仪表盘上工作,其中包含多个 statistics/facts,例如:商品销售量、收入、性别 (male/female) 用户比例等。 (所有可在最后 week/month/year 上过滤)。数据量(目前)没有那么多:20.000 行用户,1.000 件商品,每天售出 500 件商品,但预计未来会增长,甚至可能呈指数增长。

现在希望有几张图来展示效果,看策略变化对用户量、收入、性别比例等有没有影响。为此,每天都有数字是必要的。目前,仪表板只能显示 "NOW() - 1 week/1 month/1 year",但为了显示概述增长情况的图表,应每天保存这些数字。

我的问题是:在这种情况下有哪些选择?可以设置一个 cronjob 来保存这些数字并将它们写入单独的 'performance' 或 'history' table 以将访问者、销售额、性别比例等保存在链接到日期的行中那天的。这对性能有好处,但某些数据会丢失。另一种选择是使用复杂查询(按天分组)等来计算这些数字,但这似乎很密集,因为查询是在生产数据库上执行的。特别是因为数据库结构有点复杂。考虑避免在生产数据库上执行此操作,使用 ETL 进程设置数据仓库是否是避免生产数据库过载的更好选择?在那种情况下,数据将不会实时显示。

老实说,我不知道在这种情况下最好的选择是什么。我很好奇答案!非常感谢。

运行 对生产数据库(尤其是数量和复杂性不断增长的数据库)的查询很快就会成为失败的命题。有很多可能的选择,基本上整个商业智能领域都是作为这个问题的解决方案而发展起来的。

对于您只想避免查询生产数据库的小型系统,开发一个完整的数据仓库可能有点矫枉过正。在不了解更多的情况下不可能给出合理的答案,但我会选择以下之一(按结果 complexity/degree 的增长顺序):

  1. 不是直接显示查询结果,而是将其保存在table中并查询table
  2. 克隆生产数据库然后查询克隆
  3. 在保存相关数据和保存历史的结构中从生产数据库中提取相关数据(google Data Vault)
  4. 直接在生产数据库上,或在解决方案 2 或 3 上构建维度模型(google Kimball 维度模型)。请注意,要做好工作,您必须考虑要执行哪种查询。您最终可能会针对不同的要求进行不同的设计。

您使用的是哪种技术以及您的可用架构上有哪些可用选项也很重要。根据你手头的东西,你可以有一些解决方案,即使是复杂的,也可以非常简化。做一些研究。