【问题标题】:Update database table cyclically every 5 minutes每 5 分钟循环更新数据库表
【发布时间】:2016-01-11 15:54:22
【问题描述】:

我必须根据从其他表数据中的选择,使用复杂且昂贵的查询来填充和更新我的 MySql 数据库表之一。当我对其进行查询时,该表不需要始终完全更新,但我希望每 5 分钟进行一次循环更新。

这个自动更新应该是无限的,我需要确保它永远不会停止。

经过一番研究,我找到了一些解决方案,但我不知道哪个对安全性和性能更好。

其中一个可能是我的目标:

  1. 不要每次都从php创建表并进行复杂查询以获得所需的结果
  2. 创建一个循环重复并更新表 db 的 php 脚本,可能使用 Cron Job。
  3. 使用 sql 事件更新表

我认为第一个解决方案可能很昂贵,因为查询很复杂,每秒可能有很多请求,但结果总是会更新。我没有关于 Cron Job 的经验,所以我不知道这是否是一个好主意。对于第三种解决方案,我仍然没有运行事件的数据库权限,但我想知道它是否是一个有效的解决方案。

欢迎所有其他解决方案,谢谢。

【问题讨论】:

  • 解决方案 #2 可能是最佳的,一个 cronjob 触发的 php scipt 可以处理您的表的更新。您是否在其中缓存查询结果?
  • 不,我不需要缓存结果查询,因为我不必输出它们。该表用作其他大表串联的过滤器。就像一张只包含 30 个项目的表格,取自其他表格,在那一刻最适合特定属性。我不知道如何用 cron 作业来实现它,但我能确定循环永远不会停止吗?
  • 你可以在MySQL中创建一个VIEW

标签: php mysql performance mysqli cyclic


【解决方案1】:

不要使用 cron。想想如果一个实例超过 5 分钟而下一个实例启动会发生什么。最终,您将有数百个副本陷入困境。

而是在一个循环中执行更新。 (好吧,你可以有一个 cron 作业来执行一个“保持活动”任务,如果它死了就重新启动查询。)

这份工作会

CREATE TABLE new ...
INSERT INTO new  SELECT complex-stuff...
RENAME TABLE real TO old, new TO real;
DROP TABLE old;
loop.

【讨论】:

    【解决方案2】:

    我会选择 Cron Job。

    1. 它不会阻塞任何请求,因为它是从操作系统执行的。
    2. 您可以定义执行脚本的用户 (cron -u apache -e)。
    3. 易于定义间隔。 (即每 5 分钟一次 */5 * * * * php /path/to/script.php)。
    4. It's loggable

    附加说明

    我有一个在 root 下运行的 cron 作业,它运行良好。我的问题是该项目有一个私有的日志记录机制,每个日志文件都将由 apache 用户创建。通过从 root 运行它,有时文件会由 root 创建,之后,由 apache 执行的脚本将无法执行追加到日志。

    我还有一个电子邮件脚本,它每 2 分钟运行一次,但会卡住 1 小时。事实证明,由于应用程序中的一个错误,一个无效的电子邮件地址 (somethingwithoutatsign.com) 被插入到数据库中,这使得 PHPMailer 库抛出错误。之后,我添加了一个 catch 块,只要抛出异常,它就会向我发送一封电子邮件。现在,如果脚本因为执行不当而停止运行,我马上就会知道。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2014-05-01
      相关资源
      最近更新 更多