从不断附加到表中可靠地读取

时间:2010-01-12 21:09:26

标签: mysql transactions innodb

我有一个Web应用程序,其功能之一就是不断将行附加到大表中。行看起来大致如下:

id bigint not null primary key
visited datetime not null
ip_address
# Other fields

这是一张跟踪表,正如您可能已经猜到的那样。使用此表 是完全附加的,也就是说,它们之后没有修改行 插入。

然而,我们的数据量显着增加,并且有必要 将stats-processing分别处理到其他表中,而不是查询 数据并立即计算。基本上我写了一个独立的程序 大约这样做(伪代码)

while (true) {
    Select rows from tracking table where id > last_id
    Feed rows to stats processing thread
    last_id = max(id from rows)
    sleep some amount of time (~30sec is what I'm currently using)
}

但是,我担心我会丢失行。可能会出现ID的差距,因为 当我从跟踪表中选择行时,一些行id有 已被保留,但这些交易中的数据尚未提交,并且已经提交 下一个循环我已经转移到了更新的ID。

我一直想知道如何协调这一点,因为计算时缺少数据 统计数据不是一个真正的选择。

以下是我一直在徘徊的各种选择:

  1. 重新设计表格或查询,例如访问时间

  2. 不要使用关系数据库,而是某种数据排队系统?

  3. 在时滞上查询表格,即WHERE id> last_id AND visited<现在() - 一段时间

  4. 也有可能有一个我没有考虑过的选项。哪个最好 查询表的方法,所以我不会错过任何数据?

1 个答案:

答案 0 :(得分:0)

这是你可以做到这一点的一种方式(类似你的#2):

  1. 将您的数据复制到单独的“仓库”数据库。
  2. 执行ETL,以便您的数据在仓库中更加优化,以便进行查询/统计分析。对于每种记录类型,包括一个附加列,用作“状态”标志,指示记录是否已被分析引擎读取。
  3. 让您的分析在读取记录后更新“读取”列。