当前位置: 首页 > 后端技术 > PHP

让 Laravel Scout 导入提速 64 倍

时间:2023-03-29 19:14:44 PHP

让LaravelScout导入速度快64倍快64倍。我使用nullscout驱动程序测试了一个包含1,632,576个条目的表。消耗时间从29分57秒缩短为28秒。1^](https://mattallan.me/posts/ma...:1)您可以在此处查看提交的拉取请求。这篇文章解释了为什么代码中的这种变化会产生如此大的不同。这是我用来加速我自己的Laravel应用程序中有问题的查询的技巧。一旦您理解了它的工作原理,我敢打赌您会找到一种优化应用程序的新方法。背景默认情况下,Scout检索数据库中的每一行。为了保持合理的内存使用,它使用块方法一次只获取几百行。chunk方法为您的查询添加一个限制和偏移量,如下所示:select*from`users`orderby`id`asclimit500offset500;要获取下一页,偏移量会增加。select*from`users`orderby`id`asclimit500offset1000;首先这很好用,这个查询只需要大约一毫秒左右,但是你走得越远,速度就越慢。一旦偏移量达到1,000,000,查询很容易就会慢500倍。当ScoutImport执行数千个这样的查询时,它会累加起来。为什么偏移量很慢当您使用偏移量时,您是在告诉数据库跳过前N行。即使没有返回跳过的行,数据库仍然会从磁盘中读取它们并对其进行排序。数据库可能能够使用索引并避免获取整行。我们的示例查询使用了主键索引,但它仍然可以被抓取。分块使ChunkById更快事实证明,结果可以很容易地分页,而无需使用偏移量。我们所要做的就是跟踪我们看到的最后一个ID,然后过滤结果以只获取我们没有看到的行。如果结果按ID升序排序,我们可以使用简单的WHEREID>:last_id子句进行过滤。查询语句将这样结束:select*from`users`where`id`>:last_idorderby`id`asclimit500;使用这种技术后,最后一页的加载速度和第一页一样快。Laravel让这变得毫不费力。而不是调用chunk调用chunkById方法(在5.2中添加)。查询构建器将添加where子句、orderby和limit。API与块完全相同。只要您不使用任何自定义orderby子句,它就是4个字符的更改。【返回原文?