【问题标题】:MYSQL: Best approach for storing Event LogMYSQL:存储事件日志的最佳方法
【发布时间】:2016-06-07 15:31:24
【问题描述】:

我们都知道MYSQL是关系型数据库;而在我将要编写的应用程序中,我需要使用关系数据库,主要是因为实体之间共享信息和表上的连接。

但我也有一个非常特殊的情况,我需要跟踪应用程序中发生的一些事件。例如,假设我有一个名为“XP”的字段的“用户”表,现在我想保留所有导致该用户“XP”更改的事件。

嗯,最简单的解决方案是创建一个新表并使用指向负责用户的字段存储事件。但是这个表变得非常大并且填充了不必要的行,从而降低了整个应用程序的速度。

如果我使用的是面向文档的数据库,这当然不是问题,但对于 MYSQL,这往往会使一切变慢。

我想在这里了解您对解决问题的可能方法的意见,同时仍将性能保持在合理范围内。我没有在网上找到任何相关的研究或文章。

PS,我有这样的想法,将更改保存为一个字段(“用户”表的)中的 JSON 数组,但是然后读取一个字段,将其从文本转换,添加一个项目并再次保存它是非常不切实际的。

谢谢

【问题讨论】:

  • 除非您拥有大量数据,否则索引和分区可能会解决您的问题。
  • @GordonLinoff,好吧,戈登,每天会有 1 到 2 百万条记录。如果我们在一段时间后获得更多用户,可能会更多。数据很短,主要是一些整数。阅读很少见,仅用于报告和维护。但是由于这些事件发生在应用程序的不同部分,因此该表中的任何减速都会导致整个应用程序减速。我确信它不会让前几百万甚至数十亿行的事情变得糟糕,但最终呢?若干年后?我知道 MYSQL 不适合大表。至少不是在 4.x 和早期 5.x 时代。
  • 每秒 15-30 次插入并不是非常大,MySQL 应该能够处理这个问题。至于随着表变大而对表产生影响,分区可能会解决这个问题。

标签: mysql relational-database document-oriented-db


【解决方案1】:

您正在跟踪哪些类型的事件?也许使用触发器来创建事件会更实用(因此您不必在插入/更新/等上手动执行)。我还考虑尝试根据您正在处理的数据将事件分离到以事件为中心的表中,以减少您必须在给定关系上处理的数据量(例如,与 USER 相关的 LOGIN_EVENT 表USER_ID 键上的表,然后是与同一键上的 USER 相关的单独 REPORT_REQUEST_EVENT 表)。通过分离关注点,您可以创建性能更高的结构。

【讨论】:

  • 事件并不重要。因此,将它们分开只会使阅读变得更加困难。将要保存的信息只是一个 ID、一个显示事件的整数(枚举类型)、一个显示更改量的整数和一个时间戳以及一个用户 ID 字段。
  • 如果您不隔离事件,则连接将更加占用数据库。
猜你喜欢
  • 2011-07-08
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
  • 2010-09-23
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多