首页 > 解决方案 > 一个数据库或多个数据库用于统计架构

问题描述

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

现在我想扩展这个网站以包含一个完整的统计模块。我们将从我们自己网站上收集的数据中捕获大量用户操作和其他聚合,还会从谷歌分析 API 中提取一些数据以用于我们的统计数据(我们将在 Excel 中生成报告,但也会显示统计图表和页面上的数字(使用 chart.js))。我们不考虑(在可预见的未来)在其他程序中使用这些数据,但我们需要能够使用 API 向公众开放一些数据。我们预计从每天收集的大约 300.000-350.000 个数据点开始,但是随着我们获得的用户越多,这个数量每天都会继续增长。

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

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

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

想法2:创建一个新数据库,与当前现有数据库分开,并使用它将所有事件插入那里的表中,并将聚合值插入那里的新表中。

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

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

标签: mysqldatabase-design

解决方案


MySQL 不关心表是在同一个数据库中还是在不同的数据库中。这只是为用户提供方便。一些事情:

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

每晚聚合是一种中间方法。使用 IODKU 可为您提供“即时”聚合,但可能会给系统带来更多负担。

关于汇总表的博客

每天插入 350K 行大约是 5/秒,这个速度相当低,所以我认为我们不需要在那里讨论性能问题。

“总结和折腾”(针对事件)——是的。我喜欢这种方法。(大多数人都没有想到这个选项。)

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


推荐阅读