我有一个PHP脚本,它当前获取数据,并在对其应用一系列规则后,使用获取的数据填充DB表。然后,它基于所有数据进行某种计算,并根据计算结果为数据中的每条记录赋值。
一次运行大约需要25分钟,我希望在任何给定的时间都能有最新的数据。所以我想大概每隔30分钟就可以运行一次这个脚本。
然而,在正在获取的数据中,大约4/5的数据在30分钟内没有太大变化。我可以将脚本定位为获取预期在每个查询之间有更频繁更改的数据的1/5。这将需要大约6-7分钟来运行。
它应该是一个脚本,还是两个脚本?它们是否应该在给定的时间内设置为cron作业?
例如,我是否应该使用不同的表,并创建一个同时包含这两个表的视图?
为了提高性能和速度,正确的方法是什么?
发布于 2020-02-11 13:53:35
都不是。
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,等等。最终,系统将“挂起”,因为“什么都没有做”。你会本能地重启它。我的设计完全避免了这种情况。
https://stackoverflow.com/questions/60155532
复制相似问题