连续检查 MySQL 表更新的最佳方法是啥?

Posted

技术标签:

【中文标题】连续检查 MySQL 表更新的最佳方法是啥?【英文标题】:What is the best way to check MySQL table's update continuously?连续检查 MySQL 表更新的最佳方法是什么? 【发布时间】:2019-10-07 11:10:14 【问题描述】:

由于某些原因(我认为这不是我的问题的重点,但如果有帮助,请问我,我可以描述原因),我需要不断检查 mysql 表中的新记录。如果有新记录出现,我想做一些现在不重要的相关操作。

问题是,我应该如何持续检查数据库以确保我使用最少的资源并获得接近实时的结果。

现在,我有这个:

$new_record_come = false;

while(! $new_record_come) 
   $sql = "SELECT id FROM Notificatins WHERE insert_date > (NOW() - INTERVAL 5 SECONDS)";
   $result = $conn->query($sql);
   if ($result)
   
      //doing some related actions...
      $new_record_come = true;
   
   else
   
      sleep(5); //5 seconds delay
   

但我担心如果我得到成千上万的用户,它会导致服务器宕机,即使服务器是高价的!​​p>

您有什么建议可以使其性能更好,甚至完全改变方式,甚至改变查询类型或任何其他建议?

【问题讨论】:

@scaisEdge 你看过我的描述了吗? How can I determine when an InnoDB table was last changed? @MasivuyeCokile 为什么这种方式更好?因为它将连接到数据库并再次查询。那么有什么好处呢? @scaisEdge - 'cal 触发程序'?我不清楚你在说什么,你的意思是使用触发器对插入进行操作? 根据“一些相关操作”的不同,您可以使用插入后触发器,这意味着您只在需要时才工作,而不是“连续”搜索以查看您的需要做工作,然后去做。 【参考方案1】:

轮询数据库的成本很高,因此您应该警惕该解决方案。

如果您需要扩展此应用程序以处理数千个并发用户,您可能应该考虑补充 RDBMS 的其他技术。

为此,我建议使用消息队列。应用程序向数据库插入新通知后,应用程序还将向消息队列上的主题发布项目。通常,主键 (id) 是您发布的项目。

与此同时,其他应用正在收听该主题。他们不需要进行投票。消息队列的工作方式是客户端等待,直到队列中有新项目。等待将返回项目。

建议使用触发器调用 php 脚本的注释。这不起作用,因为触发器在产生它们的事务尚未提交时执行。所以如果触发器运行一个 PHP 脚本,它可能需要从数据库中读取记录。但是任何其他数据库会话都看不到未提交的记录,因此 PHP 脚本永远无法读取它收到通知的数据。

【讨论】:

我了解了消息队列的结构。但我不明白它背后的技术是什么!你能给我一个参考来阅读更多关于它的信息吗 blog.thecodepath.com/2013/01/06/… slideshare.net/mwillbanks/… “但未提交的记录对任何其他数据库会话都不可见” - 除非您将隔离级别设置为读取未提交或使用触发器将该信息发送到 php 脚本。但是,从触发器调用 php 脚本仍然不会使更改对客户端可见。 使用 read-uncommitted 是一个可怕的想法。如果系统要求使用该隔离级别才能工作,那就是危险信号。【参考方案2】:

另一个角度(比我认为的消息队列简单得多):

我曾经在一个网站上通过让客户投票并将其与他们收到的最新 ID 进行比较来实现这一点。 例如:您有一个带有主键的表,并且想要查看是否添加了新项目。 但是您不想建立数据库连接并查询表中是否没有任何新内容。

假设主键名为“postid”。

我有一个包含最新 postid 的文件。

我使用 tblposts 中的每个新条目对其进行了更新,因此它始终包含最新的 postid。

客户端的轮询脚本只是检索该文件(不要使用 PHP,让 Apache 提供它,速度更快:将其命名为 lastpostid.txt 或其他名称)。

客户端与其内部最新的 postid 进行比较。如果它更大,客户端会请求最后一个之后的那些。此步骤包含查询。

优点是你只在有新东西时才查询数据库,你还可以告诉 PHP 脚本你最新的 postid 是什么,所以 PHP 只能获取后面的。

(不确定这是否适用于您的情况,因为它假定越来越多的数字意味着“更新”。)

【讨论】:

不错的解决方案,我有同样的想法,但我想从你说不要的 PHP 循环中检查它。然后,我需要不时做一些 AJAX 来检查该文件。你确定它比在 PHP 中使用循环更好吗? 除非您让 PHP 跳过循环,否则您的 PHP 请求会在超时后结束。通过客户端对静态文件的 Ajax 调用,您在服务器上的开销非常低。【参考方案3】:

这在您当前的系统设计中可能是不可能的,但是如何不使用触发器或心跳来不断地轮询数据库,以了解您去哪里进行更新等,然后从那里执行其他代码?这样,您可以避免连续轮询数据库,并且代码只会在有人发起请求时触发?

【讨论】:

以上是关于连续检查 MySQL 表更新的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中从另一个表更新一个表的最佳方法是啥?

在使用表时更新表中数据而不锁定表的最佳方法是啥?

从 .CSV 文件比较/插入/更新 MySQL 数据库中的产品的最佳方法是啥

迁移到新的 SQL Server 后,在 MS Access 中更新链接表的最佳方法是啥?

自我更新 PHP+MySQL 应用程序的最佳实践是啥?

在 Rails 中,更新记录或创建新记录(如果不存在)的最佳方法是啥?