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

时间:2019-10-07 11:10:14

标签: php mysql polling

由于某些原因(我认为这不是我的问题的重点,但是如果有帮助,请问我,我可以描述原因),我需要不断检查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
   }
}

但是我担心,如果我得到成千上万的用户,即使服务器价格很高,也会使服务器宕机!

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

3 个答案:

答案 0 :(得分:2)

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

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

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

同时,其他应用程序也在收听该主题。他们不需要进行轮询。消息队列的工作方式是客户端仅等待直到队列中有新项目为止。等待将返回该项目。

建议使用触发器来调用PHP脚本的注释。这是行不通的,因为在尚未生成触发器的事务尚未执行时执行触发器。因此,如果触发器运行PHP脚本,则可能需要从数据库中读取记录。但是未提交的记录对其他任何数据库会话都不可见,因此PHP脚本永远无法读取通知其的数据。

答案 1 :(得分:0)

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

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

假设主键名为“ postid”。

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

我用tblposts中的每个新条目更新了它,因此它总是包含最新的postid。

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

客户将其内部最新的postid与之比较。如果更大,则客户端在最后一个之后请求。此步骤不包含查询。

优点是,您仅在有新内容时才查询数据库,并且还可以告诉PHP脚本您最新的postid是什么,因此PHP只能获取后面的postid。

(不确定它是否适用于您的情况,因为它假设数字的增加表示“较新”。)

答案 2 :(得分:0)

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