2012-03-23 138 views
1

我想从MySQL表中提取增量更新。问题表中有一个自动递增的ID字段,以及每次更改(INSERT/UPDATE)时更新为当前时间戳的updated_at字段。记录不会从这张表中删除。从MySQL表中提取增量更新

我想从脚本的最后一次运行以来,从此表中提取所有新创建和更新的记录。我知道最后一次运行的最高updated_at值。因此,提取记录的主要查询将如下所示:

SELECT * FROM table WHERE updated_at >= :last_seen_updated_at 

实现此目的的最佳方法是什么?我必须100%确定将提取所有新的和更新的记录。一些问题和顾虑:其中一些

  • 多个记录可以在同一秒内被更新,其中一些可能已经被列入前提取来看,并非如此。 (例如:提取器运行在第二秒的前半部分,而记录可能会在第二秒的后半部分更新。
  • 我应该使用一个大的SELECT查询还是应该使用多个查询来提取批量的X记录?请注意,要提取的数据量可能很大,如果我使用批处理,则记录可能会在不同查询之间更新。
  • 最好不要提取重复记录,但这不是一个大问题。有意义的最后一次露面更新之前开始的时间X量,“以防万一”?(如updated_at >= :last_seen_updated_at - INTERVAL 1 MINUTE
  • 我应该?重复读运行什么隔离模式下,这些疑问?SERIALIZABLE?
  • MySQL的d atabase是一个复制的slave,它有时会滞后master DB。这会对包含或不包含的行产生任何影响吗?

回答

1

这不是一个完整的答案,但它是一种避免重复的可靠方法。首先,当你运行更新脚本时,不要在当前秒运行它。在超过5秒的时间内运行它。那样的话,你知道如果你有一个给定秒的记录,那么你就有第二个记录。完成之后,您应该能够使用updated_at > :last_seen_updated_at并避免更新周期之间的重复。

此时,您应该可以随意抽取批量或一个大型查询。至少如你所描述的那样,你将要提取的数据在很大程度上是静态的 - 当你走的时候,可能会有其他条目被添加到表中,但是它们都将在任何你的任意最近截断的第二个是,所以不会成为你的查询的一部分。

对于从/主问题,这可能有点担心,但只要主人先更新旧记录,它仍然很容易解决。在设置更新截止日期时,请在本地记录中查找最近的时间间隔并减去一秒钟。

仍然存在您关注的时间段中添加或更新的条目在解压时可能会再次更新的问题。严格防止这种情况的唯一方法是在解压缩时断开与服务器的连接并缓存更改,但在完成相对少量的添加和修改后,可以通过返回并再次运行脚本来显着降低事件发生率这是在您提取较大的群组时发生的。你可以多次重复这一点,因为你觉得偏执狂保证。或者,您可以计算预提取,提取和计算提取的数量的行数。如果有任何区别,您可以再次运行该过程,直到您获得前后的相同编号。