繁体   English   中英

优化数据库查询导轨

[英]Optimize Database Query Rails

所以我正在和几个我的朋友一起在Rails端项目上工作,这需要加载很多种子数据。 我将种子数据保存在JSON文档中,该文档现在包含将近3200个JSON对象,每个对象具有相同的3个字段名称。

我已经将这些数据解析并植入了Rails中,为每个JSON对象创建了一条新记录。 我应该注意该对象具有一些has_many关联。

问题是,在用JSON文件为数据库播种后,当我尝试将所有3200条记录加载到页面中时(仅使用普通的ModelName.all.each块),加载时间太可笑了……大约17826ms (17.8秒)。

根据控制台,它说(Views: 16252.4ms | ActiveRecord 1522.9ms) 我已经研究了实现急切的加载和预加载(并且我仍在努力)。

我的问题是,我该如何进一步优化? 我已经尝试过ModelName.preload(:associationName)进行预加载,但这似乎根本没有改变回复时间(也许我做错了)。 我不知道的是3200条记录不是很多...为什么要花这么长时间? 在项目的早期阶段,像Redis这样更快的整合方式是否可行?

您可能遇到了n+1问题,请确保获取了控制器中的所有对象,但是在视图中,您正在访问一些需要额外的惰性查询的关系,以解决需要急于加载整个数据的问题,请使用includes关键字

@all_objects_with_associations = SomeObject.includes(:some_association).all

另一个额外的级别是使用片段缓存,假设您不想进行分页(如果您使用的是rails 4,则默认情况下已启用),您要做的就是在模板顶部添加一个缓存块,以及所有变量您认为如果更改将需要缓存无效

cache @all_objects_with_associations do

要获取更多信息,您可以检查以下链接

急于在轨道上装载
Rails中的片段缓存

这种观点真正杀死了速度。 渲染许多对象当然需要时间。 您应该对数据进行分页并一次显示有限数量的数据。 这将减轻数据库和视图的负担。

使用“ will_paginate”进行分页。

另外,您可以实现“垂直分页”,即,一旦页面向下滚动到底部以获取并附加更多结果,就可以进行AJAX调用。

此外,我将查看该视图并确保没有通过该视图进行数据库查询。 如果是这样,我会尝试通过急于加载或以某种方式将它们移动到控制器中来消除它们,即已将数据发送到视图而没有视图获取数据。

除了分页之外,您只能从数据库中获取必填字段,这将进一步提高性能。

由于您的视图占用了大量时间,因此请考虑以下因素:

  • 使用局部函数,辅助方法(以简化视图逻辑)
  • 将渲染移至客户端(从服务器端发送JSON)
  • 添加缓存策略

如果您可以发布有关您的视图的一些详细信息,它将帮助我们提供更多的自定义帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM