几个拥有大型 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)