我有一个每小时运行一次的cron作业,用来自API的每小时数据更新本地数据库。
数据库按行存储每小时数据,API返回24个数据点,代表过去24小时。
有时会错过数据点,所以当我收回数据时,我只能更新最新的小时 - 我还需要检查我之前是否有这些数据,并填写找到空白的任何空白。< / p>
所有东西都在运行和运行,但是cron作业每次至少需要30分钟才能完成,我想知道是否有办法让这次运行更好/更快/更有效率?
我的代码执行以下操作:(简洁的摘要代码!)
// loop through the 24 data points returned
for($i=0; $i<24; $i+=1) {
// check if the data is for today, because the past 24 hours data will include data from yesterday
if ($thisDate == $todaysDate) {
// check if data for this id and this time already exists
$query1 = "SELECT reference FROM mydatabase WHERE ((id='$id') AND (hour='$thisTime'))";
// if it doesnt exist, insert it
if ($datafound==0) {
$query2 = "INSERT INTO mydatabase (id,hour,data_01) VALUES ('$id','$thisTime','$thisData')";
}
}
}
并且有1500个不同的ID,所以这样做了1500次!
有什么方法可以加快或优化这段代码,使其运行得更快更有效率?
答案 0 :(得分:1)
这似乎并不复杂,应该在几秒钟内运行。所以我不知道你的数据库的第一个猜测是你缺少数据库的索引。因此,请检查id
字段中是否有索引。如果您的id
字段不是您的唯一键,则应考虑在2个字段id
和hour
上添加其他索引。如果这些已经存在,那么这将导致大量的时间节省。
另一个想法可能是在单个sql查询中检索过去24小时内的所有数据,将值存储在数组中并执行检查,如果您已经只在阵列上读取了这些数据。