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



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

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

在主页上,我们有预约日历。当您单击某个日期时,会显示一个约会创建模式。此模式使用JQuery Autocomplete,以便企业所有者可以开始键入子/父名称,然后从列表中选择它们。由于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个孩子,加载时间只有几百毫秒。然而,我们有几个用户的数据库中有3000多个孩子。当他们访问主页时,他们的加载时间通常超过5000毫秒。这会减缓对同一Heroku dyno上其他人的请求。

一个可能的解决方案是,每次点击日历日期并出现模式时,都加载Kids。这将增加请求量,因为大多数用户都会呆在主页上,经常点击日历。对于小用户来说,为自动完成加载一次孩子是有意义的,因为这样孩子就会被加载到主页上,以备将来的请求(只要他们不从主页导航(。我希望这是有道理的。

我们只是想办法加快这些有几千个孩子的用户的请求。

欢迎提出任何想法!

您确切知道性能瓶颈在哪里吗?在不知道这其中哪一部分速度较慢的情况下,在更改功能的总体设计之前,我会尝试在活动记录关系中使用#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上添加一个数据库索引。

最新更新