【问题标题】:Keep MySQL database in sync with polled data使 MySQL 数据库与轮询数据保持同步
【发布时间】:2014-01-11 00:16:12
【问题描述】:

我有一个有趣的情况,我不断地从服务器轮询数据。我无法控制它提供的内容,所以我只需要处理它给我的东西。

我正在记录它提供的一些信息,并将其存储在 MySQL 数据库中。这不是一个真正的问题,但是,我的问题是如何有效地使数据与数据库保持同步。

例如,在某一时刻,我可以有 3 个 ID 1001、1002、1003。我可以将它们插入数据库中,但是如果我现在有 1001 和 1003 怎么办。最有效的更新方法是什么?反映这一点的数据库?基本上,我只知道我现在拥有什么,如果不自己在 PHP 中计算,我无法知道发生了什么变化。

我想我可以选择,找到差异,然后针对丢失/添加的 ID 发出 DELETE/INSERT。或者可能是 DELETE NOT IN () 然后是 INSERT.. 但由于这个脚本一直在运行,我担心这不会很有效。

我的另一个想法是简单地为每个“玩家”制作一行,并使用 CSV 分隔的 ID 列表。每次迭代我都可以为该播放器更新行,而不是选择/删除/插入。

有没有人遇到过类似的问题并找到了好的解决方案或有一些见解?我将不胜感激!我正在使用 PHP。

【问题讨论】:

  • 如果您想用从服务器接收到的最新数据替换现有数据,为什么不清除当前存储的所有数据,然后插入已收到的数据?
  • 从一个播放器中删除所有行,并插入当前数据?考虑到我需要从其他脚本访问这些信息,这将是多么有效。几乎在任何时候,一个玩家都没有行,那将是无效的。
  • 在一个事务中执行两个操作(DELETE,然后是 INSERT):其他会话会认为它是原子的。
  • 嗯。我从来没有考虑过交易。您认为这与 PHP SELECT、比较数据和必要时 DELETE/INSERT 相比在效率上如何?

标签: php mysql sql database pdo


【解决方案1】:

如果我明白你的要求,也许你可以试试REPLACE INTO

http://www.mysqltutorial.org/mysql-replace.aspx

如果要插入的记录不存在,MySQL REPLACE 会插入一条新记录。

如果要插入的记录已经存在,MySQL REPLACE会先删除旧记录,再插入新记录。

这将使您无法选择、删除和插入。这处理。

【讨论】:

  • 我不一定需要替换已经存在的信息。我更关心有效地删除源数据中不再存在的行并插入新行。
  • 哦,对不起,让我解释得更好。我不需要删除当前行,除非它们不再存在于我的源数据中。替换在这里不合适,因为它会替换为相同的信息。
【解决方案2】:

如果您有能力截断整个表并重新加载它,您可以这样做。

使用加载的新数据创建一个临时表

将原表与临时表连接,删除临时表中不存在的行

使用编程语言,识别出原表中不再需要存在的id并删除

【讨论】:

    猜你喜欢
    • 2011-07-14
    • 2010-09-14
    • 1970-01-01
    • 2010-10-29
    • 2017-09-01
    • 2013-06-12
    • 2020-03-22
    • 1970-01-01
    • 2021-01-03
    相关资源
    最近更新 更多