【问题标题】:Watching a table for change in MySQL?在 MySQL 中查看表以进行更改?
【发布时间】:2008-10-03 14:51:28
【问题描述】:

除了每隔 n 次或类似的时间从表中进行选择之外,还有更好的方法来观察表中的新条目吗?

我有一个外部程序经常更新的表,并且客户端可以在新数据到达时观察它,我怎样才能做到这一点而无需设置固定周期的可重复选择语句?

【问题讨论】:

标签: mysql database


【解决方案1】:

另一种类似的方法是添加

add column Last_Modified TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP 

到每个表并为您的选择查询添加前缀,以将上次请求日期/时间与最大值(Last_Modified)进行比较。

数据库通常是pull 源而不是push,因此无论如何您仍然需要以编程方式探测更改。

【讨论】:

    【解决方案2】:

    在 MySQL 中,没有比轮询更好的方法(您创建一个特定的表来简化轮询),在其他数据库中,您可以使用对数据库外部产生影响的触发器。在 MySQL 中,triggers 只能在数据库内部做一些事情(例如,填充帮助表)。

    【讨论】:

      【解决方案3】:

      这是我的工作: 我为表设置了一些触发器(插入、删除、更新),这些触发器增加了另一个表中的计数器。我的数据库访问代码保留一个本地计数器并将其与返回值进行比较,最终将一个布尔值发送回调用者,回答 IsDataCurrent() 问题。

      我们使用此数据库访问代码的程序会根据请求轮询或检查它,然后进行适当的调用以使自己保持最新状态。

      我相信还有其他方法可以解决这个问题。不过,它对我来说效果很好。

      【讨论】:

      • 所以还是需要轮询,只是轮询稍微好一点:select * from lastupdatetable;与从数据表中选择计数(*);
      • 我不同意。查询 select count(*) 可能会产生错误的结果。如果我执行添加/删除/和添加,计数将相同,对吗?那么数据有变化吗?在那种情况下你不会知道。上次更新表不会产生这种情况。
      • 但是还是需要每n个tick选择一次,不过这样比选择实际的数据表成本要低,我也在考虑这种方式。
      【解决方案4】:

      如果您可以控制主机,可能触发数据库外的行为。

      一) This question's answer suggests 使用 'select into outfile' 写入文件,某些系统进程会监视该文件的更改(例如,基于 inotify 的方法,例如 node-inotify 甚至 Grunt-watch 可能就足够了)

      B) 对于勇敢者: The answer to this question 指出,如果您可以将 C/C++ 附加组件安装到数据库服务器,您可以使用用户定义函数 (UDF) 调用 sys_exec() 从而触发外部进程,或者可能直接将实际进程写入UDF。

      http://dev.mysql.com/doc/refman/5.0/en/faqs-triggers.html#qandaitem-B-5-1-11

      (我目前正在研究这个,对于 AWS RDS 托管的应用程序,所以很遗憾,这些选项都不适合我。)

      【讨论】:

        【解决方案5】:

        这只是对您的方法的一个小改进。在您正在监视的表上编写触发器以更新 Last_Changed 表。

        【讨论】:

          【解决方案6】:

          对于那些在 go 中这样做的人。您可以启用 binlog 并读取 binlog 以在任何表上进行新的插入/更新/删除。有一个 go 包here 可以解决问题。 here 是一个示例实现。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-29
            • 2017-12-30
            • 2019-10-01
            • 1970-01-01
            • 2011-08-09
            相关资源
            最近更新 更多