一个或多个数据库用于统计体系结构

时间:2019-02-13 10:27:37

标签: mysql database-design

我目前已经有一个使用CodeIgniter和MySQL运行的网站。 MySQL数据库大约有110个表,主要包含特定于网站的数据,例如用户数据,空缺数据等。

现在,我想扩展此网站以包括完整的统计模块。我们将从自己网站上收集的数据中捕获大量用户操作和其他汇总,还将从Google Analytics(分析)API中提取一些数据以用于我们的统计信息(我们将在Excel中生成报告,但还会显示统计图和页面上的数字(使用chart.js))。 我们不打算(在可预见的将来)在其他程序中使用此数据,但是我们需要能够使用API​​向公众开放一些数据。 我们希望从每天收集大约300.000-350.000数据点开始,但是随着我们获得的用户越来越多,这个数量当然会每天持续增长。

在CodeIgniter中使用多个数据库似乎不是问题,所以我剩下的主要问题是如何为该统计模块创建体系结构。

关于如何开始执行此操作,我有几个想法,但是我不知道一个解决方案对另一个解决方案是否会对性能产生影响,或者是否需要考虑其他因素。 我的主要思想归结为拥有一个包含所有“事件”的表,该表在每次执行操作时都插入到该表中,例如“用户注册”,“用户将帐户设为私有”,“用户单击X”, ... 然后,每天一次(可能大约在午夜左右),CRON作业将在过去的一天中在该表上运行,并将所有值汇总为可用于我们的统计指​​标的格式。这些汇总值将存储在新表中。这样,我们可以非常定期地清理“事件”表,因为这将变得非常大。

想法1:用新表扩展当前的MySQL数据库体系结构以合并统计信息。我将继续使用当前的数据库体系结构,并为事件和聚合值添加2个新表。

想法2::创建一个与当前现有数据库分开的新数据库,并使用该数据库在该表中插入所有事件,并在该表中插入汇总值。

注意:我们已经在当前数据库中运行了很多CRONS,它们正在更新状态和日期,发送电子邮件,...

注2:数据库之间的同步问题不是问题,因为我们永远不会在每个用户级别存储统计信息。

1 个答案:

答案 0 :(得分:1)

MySQL不在乎表是在同一数据库中还是在单独的数据库中。这只是给用户带来的便利。一些事情:

  • 您可能需要db1.tbla JOIN db2.tblb才能跨数据库交谈。
  • 对于不同的数据库使用不同的GRANTs很方便,但是对于110个表使用不同的GRANTs则很笨拙。
  • 我想不出任何性能差异。

夜间聚合是中间方法。使用IODKU可以使您“立即”进行聚合,但可能会给系统带来更多负担。

我的blog on Summary Tables

每天插入35万行,大约为5 /秒,这很低,所以我认为我们不需要在这里讨论性能问题。

“摘要和折腾”(对于事件)-是的。我喜欢这种方法。 (大多数人没有想到这个选项。)

算一下。一年之后哪张桌子最大?多少GB?然后考虑是否可以缩小其中的任何列:SMALLINT而不是INT,长整型,经常重复,字符串等的规范化。