0

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

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

最初我想运行一个活动记录查询Product,产生@matchingproducts- 例如@matchingproducts = Product.where(...)

有2个轻微的并发症:

  1. @matchingproducts通常包含大约 200 条记录,我使用 paginate 一次显示这些结果 50
  2. 我希望能够应用更多过滤器@matchingproducts以使用户能够微调结果(例如@matchingproducts_filtered = @matchingproducts.where(...)

问题 我应该如何定义我的变量@matchingproducts,使得整个数据库 ( Product) 的查询只执行一次(即在“详细信息”页面的初始加载时?

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

您可以就此问题提供的任何指导将不胜感激

4

2 回答 2

1

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

于 2013-09-04T14:33:50.200 回答
0

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

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

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

如果您正在进行大量搜索/过滤,您可能会查看Sunspot /SOLR。但是探索这将消耗更多的初始和重复时间,而不是您在这个问题上花费的时间,所以我现在不建议这样做。请记住这一点,以便以后使用更大的数据集进行复杂且多变的查询。

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

于 2013-09-04T15:14:23.477 回答