高效的数据库查询 - 避免重新评估页面加载

时间:2013-09-04 14:23:05

标签: ruby-on-rails ruby-on-rails-3 variables activerecord

我想知道是否有人可以提供一些指导,以解决我在使用rails应用程序时遇到的问题的最佳方法。

背景 我有一个名为Product的大型数据库,其中包含大约500,000行。我想创建一个页面(这可以称为"详细信息"),使用户能够查看Product中项目子部分的信息。

最初我想在Product上运行有效的记录查询,产生@matchingproducts - 例如@matchingproducts = Product.where(...)

有两个轻微的并发症:

  1. @matchingproducts通常包含大约200条记录,我使用paginate一次显示50条记录
  2. 我希望能够对@matchingproducts应用更多过滤器,以便用户对结果进行微调(例如@matchingproducts_filtered = @matchingproducts.where(...)
  3. 问题 我应该如何定义我的变量@matchingproducts,使整个数据库(Product)的查询只执行一次(即在"详细信息"页面的初始加载时?

    目前,每当我使用Product查看下一个x记录以及用户指定paginate时,我的@matchingproducts_filtered查询时间都会重新运行

    非常感谢您就此问题提供的任何指导

2 个答案:

答案 0 :(得分:1)

您正在做的分页是最好的事情,同时索引产品表。一次加载所有记录的问题将在内存中也不是一个好主意。如果这样做,您已将所有结果放在一个数组中并相应地对其进行分页,这意味着您必须始终在内存中保持同步。另一个问题是,如果记录(产品)得到更新,它将不会立即显示,直到刷新内存中的数组。与数据库一起完成时,分页效果很好。如果这对你没有意义,我想你应该尝试一些其他解决方案。

答案 1 :(得分:0)

正如Sergio Tulentsev所说,你应该确保你有正确的索引设置。在最近的硬件上,500,000条记录对于现代的,生产质量的数据库来说并不是一个巨大的数量,因此查询速度很慢,这可能是首先要考虑的事情之一。

如果它正在加载许多相关的关联/子关联等,则可能是查询includes可能有帮助的n + 1查询问题。如果您查看日志并正在调试ActiveRecord查询,您可能会看到大量查询针对单个请求以及您认为查看代码时的单个查询。这将是n + 1查询的标志。

如果您不需要显示某些关联/子关联/等。数据,也许你可以没有它。

如果您正在进行大量搜索/过滤,可以查看Sunspot / SOLR。但是探索这会比你需要花费在这个问题上花费更多的初始和重复时间,所以我不会在此时提出建议。请记住这一点,以便稍后使用更大的数据集进行复杂和变化的查询。

不幸的是,这些与提高性能相关的问题实际上是开放性的,因为可能涉及很多因素,但希望这将有助于作为一个开始。