【问题标题】:Strategy for table design for high write table/高写表的表设计策略/
【发布时间】:2011-02-21 06:57:13
【问题描述】:

我有一个日志表,用于记录用户在网站上执行的每个操作、点击等。
所以每秒可能有数十万条条目等待写入。

我假设数据库必须一次写入一行,它不能同时写入多行?所以让我们假设有 500,000 个条目是通过 500,000 个登录用户发生的,现在人们每秒都在移动,所以数据库可以每秒处理 100,000 行,余额行会发生什么?

它是自动在队列中等待还是数据库会给出写入错误,或者如果延迟是 5 分钟,它会等待 5 分钟来写入记录吗?

我可以为我的极高写表使用哪些技术/策略等?我知道不要对这些表使用 FK。还有什么?

我的数据库是 MySQL,应用程序在 codeignitor 中。所有表都有innoDB引擎。

【问题讨论】:

  • 您需要对日志数据进行哪些类型的查询,结果需要保持多长时间?例如,您可以将日志数据附加到文件中,然后将其批量导入数据库。
  • 这是一个活动日志表,其中包含实时提要,例如您的 fb 提要。所以尽可能实时。因为计划是将数据从该表移动到针对用户提要进行非规范化的 activity_log 表。所以如果这个表不是最新的,那么其他表就会卡住。

标签: database-design


【解决方案1】:

由于实际的日志记录可能不需要实时更新,我会利用消息队列将“日志”消息发送到另一个进程来写入它们。这样,当晚上或通宵使用率下降时,记录的处理最终可能会赶上。

否则,您可能会处于最终写入超时并开始阻止浏览您网站的人的情况。

我不是 MySql 专家,但如果它像 SQL 服务器一样工作,实际的客户端会向服务器发送命令,如果命令未在设定的时间内完成,则事务超时并回滚。

使用日志文件方法存在相同的问题,因为所有线程都将尝试写入同一个文件,并且磁盘争用可能是一个问题。如果您将队列放在另一台服务器上,您可以扩展您的解决方案。

【讨论】:

  • 此数据用于实时提要。用户进行一些活动,例如对照片发表评论或单击链接 x,... 此数据将写入日志表。从日志表和其他表(会话、对象、帐户等)中,数据移动到 activity_feed 表,系统读取该表以输出到活动源。因此,如果日志表没有按时写入,那么数据将不会移动到 feed 表,这意味着没有实时 feed。
猜你喜欢
  • 2021-09-19
  • 2013-05-17
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 2011-04-08
相关资源
最近更新 更多