我正在开发一个连接到遗留数据库的应用程序。主要模型基于一个非常大的100+列表。我对ActiveRecord的内部工作原理了解不多,但在我看来,这个模型上的任何请求都变慢了,因为它正在创建具有100+属性的对象。让我们称其为SlowModel。
在我的dev计算机上,使用这种模型渲染页面有时需要17秒。直接的mysql查询只需要0.5 -1秒。
我已经设法通过使用选择字段子集(20个左右)的MySQL视图来加速应用程序的一部分。我们将其称为QuickModel。使用视图是可以的,但不是最便携的解决方案。
我可能会继续尝试将这个QuickModel添加到站点的其他部分,但我想知道是否有人有其他想法来加速原始对象。例如,有没有一种方法可以在模型中指定activerecord应该忽略和避免构建的列?可能有特定的列类型(:text??)这会导致ActiveRecord对象膨胀。
假设列有适当的索引。
发布于 2011-08-31 23:23:23
如果有一个全新的QuickModel,它位于自己的表中……和一台QuickModel has_one SlowModel?
您可以使用SQL将最需要的数据移动到QuickModel表中,并且仅在必要时使用my_quick_model.slow_model引用SlowModel。
或者,您可以向默认作用域添加"select“(您可以搜索"rails默认作用域”以获取更多信息)。默认情况下,它只获取精简集-但您可以通过传递以下命令来请求所有属性:如果需要,请选择=> "*“。
发布于 2011-08-31 23:20:23
您可以使用ActiveRecord查找的:select选项指定在模型查找中返回哪些列:
SlowModel.all(:select => 'id, col1, col2, col3')...will加载仅填充了指定列的SlowModel实例。
发布于 2011-09-01 10:29:03
按照Winfield所说的思路,您可能希望了解一下如何使用像SlimScrooge这样的属性跟踪器。跟踪器尝试只获取您正在使用的数据,这降低了开销。它试图自动执行Winfield建议的操作。
自述文件中的示例:
# 1st request, sql is unchanged but columns accesses are recorded
Brochure Load SlimScrooged 1st time (27.1ms) SELECT * FROM `brochures` WHERE (expires_at IS NULL)
# 2nd request, only fetch columns that were used the first time
Brochure Load SlimScrooged (4.5ms) SELECT `brochures`.expires_at,`brochures`.operator_id,`brochures`.id FROM `brochures` WHERE (expires_at IS NULL)
# 2nd request, later in code we need another column which causes a reload of all remaining columns
Brochure Reload SlimScrooged (0.6ms) `brochures`.name,`brochures`.comment,`brochures`.image_height,`brochures`.id, `brochures`.tel,`brochures`.long_comment,`brochures`.image_name,`brochures`.image_width FROM `brochures` WHERE `brochures`.id IN ('5646','5476','4562','3456','4567','7355')
# 3rd request
Brochure Load SlimScrooged (4.5ms) SELECT `brochures`.expires_at,`brochures`.operator_id,`brochures`.name, `brochures`.id FROM `brochures` WHERE (expires_at IS NULL)https://stackoverflow.com/questions/7258529
复制相似问题