在Laravel中优化UpdateOrCreate

时间:2017-09-28 14:14:21

标签: php mysql laravel

我从外部URL下载XML并将其解析为mysql。

Rate::updateOrCreate([
    'exchanger_id'      => $exchangerId,
    'signature_from_id' => $signatureFromId,
    'signature_to_id'   => $signatureToId
], [
    'in'     => $item->in,
    'out'    => $item->out,
    'amount' => $item->amount
]);

事情是XML包含许多项目,并且我解析了许多站点,因此它导致20K查询20-25个URL。稍后,我将解析大约300个URL,查询数量将会增加。

我如何优化此流程?我的意思是updateOrCreate部分。如果存在exchanger_idsignature_from_idsignature_to_id的行,我需要更新它,否则创建一个新行。并为每个xml项重复一次。

当我意识到Laravel至少进行了2次查询时:首先是select,它检查该行是否存在,其次是create/update

无法考虑任何批处理示例:(

更新

我为前三列(intersection_id,signature_from_id,signature_to_id)创建了一个唯一的复合键,并下载了这个特征https://github.com/yadakhov/insert-on-duplicate-key

查询数量变为26(约为20000)。但处理所有这些所需的时间并没有改变。我错过了什么......

1 个答案:

答案 0 :(得分:0)

如果您的商业案例允许,为什么不这样做呢。

(1)将所有xml批量存储在应用程序的某个文件夹中

(2)创建将为您执行处理的Cron作业并触发您在处理完成时可以捕获的事件,以便您可以执行下一步操作?看看调度工作here。另请查看laravel here中的队列和事件,以获得更多先进的想法。