几个拥有大型 JQuery 自动完成数据集的用户降低了整个 Ruby on Rails 应用程序的速度

Posted

技术标签:

【中文标题】几个拥有大型 JQuery 自动完成数据集的用户降低了整个 Ruby on Rails 应用程序的速度【英文标题】:Several Users with Large JQuery Autocomplete Data Sets Slowing Down Entire Ruby on Rails App 【发布时间】:2021-06-26 12:28:26 【问题描述】:

只是想知道我是否可以从更高级的程序员那里获得一些建议,以了解在我们的日托应用中加载大量数据的更好方法。

该应用程序非常基础。当用户登录时,它会加载他们所有的孩子,以便他们为他们安排日托预约。

在主页上,我们有约会日历。当您单击某个日期时,会显示约会创建模式。此模式利用 JQuery 自动完成功能,因此企业主可以开始输入孩子/父母的姓名,然后从列表中选择它们。由于需要 JQuery 自动完成功能,因此在加载主页时,每个孩子都会被加载到 JSON 字符串中。

kids_for_autocomplete = []
Kid.where(business_id: current_user.business_id).order_by_name.pluck(:id, :name, :parent_name, :archived).each do |kid_id, kid_name, parent_name, archived|
  kids_for_autocomplete << :label => "#kid_name ( #parent_name )", :value => "#kid_name ( #parent_name )", :id => "#kid_id" unless archived == true
end

@kids_for_autocomplete = kids_for_autocomplete.to_json

因此,大多数用户的数据库中有 100 到 300 个孩子,加载时间只有几百毫秒。但是,我们有几个用户,他们的数据库中有超过 3,000 个孩子。当他们访问主页时,他们的加载时间通常超过 5000 毫秒。这会减慢对同一 Heroku dyno 上其他所有人的请求。

一种可能的解决方案是在每次单击日历日期并出现模式时加载孩子。这将增加请求的数量,因为大多数用户停留在主页上并经常点击日历。对于小用户来说,为自动完成加载一次孩子是有意义的,从那时起,孩子会被加载到主页上以供将来的请求(只要他们不离开主页)。我希望这是有道理的。

我们只是想找出一种方法来加快这些拥有数千个孩子的用户的请求。

感谢任何想法!

【问题讨论】:

更改自动完成以查询服务器 api 操作,该操作接受用户键入的内容及其 id 等,并查询数据库。 【参考方案1】:

您确切知道性能瓶颈在哪里吗?在不确切知道其中哪一部分很慢的情况下,在更改功能的整体设计之前我会尝试的几件事是在 Active Record 关系上使用 #find_each 而不是 #each。所以,

Kid.where(business_id: current_user.business_id).order_by_name.pluck(:id, :name, :parent_name, :archived).find_each do

这将避免一次将数千条记录加载到内存中以构建您的 JSON。

如果您还没有数据库索引,我还会在 kids.business_id 上添加一个数据库索引。

【讨论】:

以上是关于几个拥有大型 JQuery 自动完成数据集的用户降低了整个 Ruby on Rails 应用程序的速度的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET WebAPI和带有大型数据集的jQuery(json)

具有大型(70,000+ 项)数据集的高效 jQuery 实时搜索

Django:具有多个查询集的 jQuery 自动完成

SQL Server 中对大型数据集的慢速不同查询

大型数据集的排序无法完成

自动完成 jQuery / PHP / MySQL 不返回结果