【问题标题】:Fetch partial data in more frequent intervals, while keep fetching full data in less frequent intervals以更频繁的间隔获取部分数据,同时以不太频繁的间隔继续获取完整数据
【发布时间】:2020-05-26 01:47:01
【问题描述】:

我有一个 PHP 脚本,它当前获取数据并在对其应用一系列规则后,用获取的数据填充数据库表。然后,它根据所有数据进行某种计算,并根据计算结果为数据中的每条记录分配一个值。

单次运行大约需要 25 分钟,我希望在任何给定时间尽可能获得最新数据。 所以我猜这个脚本只能作为 cron 作业每 30 分钟运行一次。

但是,在获取的数据中,大约 4/5 在 30 分钟内变化不大。 我可以将脚本定位为获取预计在每个查询之间会有更频繁更改的数据的 1/5。这大约需要 6-7 分钟才能运行。

问题是我如何创建一个脚本,该脚本将每 10 分钟获取 1/5 的数据,并继续每 30 分钟获取另外 4/5 的数据,因为最终我需要显示所有数据并进行计算数据在一起。

应该是一个脚本还是两个脚本?是否应该在给定时间将它们设置为 cron 作业?

我应该使用例如不同的表,并制作一个同时使用这两个表的视图吗?

另外,当两个脚本一起运行时,在第 30 分钟会发生什么,如果两者都需要相同的 MYSQL 服务器来处理,我认为两者的完成时间都会慢于 30 分钟和 10 分钟(如果我获取它,API 服务器也可能会引发更多错误一次有 2 个脚本,但不确定)。

提高性能和速度的正确方法是什么?

【问题讨论】:

  • 我会调查现有脚本是否可以通过优化查询或调整服务器设置来加快速度。 25 分钟对于经常性工作来说是相当长的时间,如果它没有更新数百万行,我希望它应该运行得更快。

标签: php mysql multithreading database-design architecture


【解决方案1】:

都没有。

Cron 不太适合持续做某事。它擅长定期做一些快速的任务

因此,有一个程序可以持续加载所有数据。或者它具有智能重新加载部分数据几次,然后重新加载其余数据。

但是,一旦完成,它就会重新开始。同时,让 cron 运行一个“keep-alive”程序来执行一项快速任务是明智的:查看下载任务是否处于活动状态;如果没有,它会重新启动它。

如果要重新加载整个表,请按以下方式进行:

CREATE TABLE t_new LIKE t;
load the data by whatever means
RENAME TABLE t TO t_old, t_new TO t;
DROP TABLE t_old;

这样,t 始终存在并完全加载。

如果您只刷新表格的一部分,请执行类似的操作

CREATE TEMPORARY TABLE temp ...;
load some data into `temp`
massage, if needed, that data
INSERT INTO t (...)
    SELECT ... FROM temp
    ON DUPLICATE KEY UPDATE ...;
DROP TEMPORARY TABLE temp;

如果 IODKU 不适合,请选择其他方法。要点是让其他表中的数据随时可用,以便您可以快速将其复制到实际表中。 (注意:这种方法会锁定表一段时间;完全替换方法的停机时间几乎为零。)

如果可能,将您的“规则”应用于整个表的数据价值;不要一次处理一行。 (这可能会产生显着的性能差异。)

哦,我应该详细说明为什么我不喜欢将 cron 用于主要任务。今天,该任务需要 25 分钟,每 30 分钟运行一次。明天,有些事情会发生变化,这需要 35 分钟。现在下一个实例将踩在第一个实例上,也许会弄得一团糟。或者也许只是放慢速度。如果只是慢下来,那么后续实例可能会更慢,因为它们正在争夺 CPU 等。最终,系统将“挂起”,因为“什么都没有”完成。你会本能地重新启动它。我的设计完全避免了这种情况。

【讨论】:

  • 谢谢。 PHP 可以有效地做到这一点吗?另外,我要插入的计算结果怎么样,例如,每 5 分钟进行一次这样的计算,并为所有符合某个条件的记录设置一个标志?这也应该作为一些插入到同一个表中来完成,还是应该完全不同?
  • @user8411456 - 请详细说明 25 分钟的处理时间 - “获取”?从一些缓慢的、远程的站点? PHP中的数字运算?最后是INSERTing? UPDATEing`?进数据库?每个阶段的 25 分钟占几分之一?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
相关资源
最近更新 更多