gpt4 book ai didi

ruby-on-rails - 如果我使用 will_paginate gem,mongo 查询是否仍然选择所有行然后分页?

转载 作者:可可西里 更新时间:2023-11-01 10:06:46 25 4
gpt4 key购买 nike

代码:

Channel.all.paginate(:page => 3, :per_page => 25)

假设我有一个包含 400,000 条记录的表,上面的代码是选择所有 400,000 条记录然后获取我需要的当前 25 条记录,还是只查询我需要的 25 条记录。

如果它查询所有 400,000 条记录,是否有更好的优化方法来使用 rails 对大型数据集进行分页?

最佳答案

Mongo Mapper(我假设您使用它是因为您的查询语法)正在使用限制和跳过表达式实现这一点。

基本上,它会运行一个查询,跳过多个 channel ,然后检索限制指定的数量(每页获得的数量)。

例如:如果您在第 3 页并且每页有 25 个,则 mongo mapper 运行的查询如下所示:

db.channels.find().skip((page - 1) * per_page).limit(per_page)

转化为:

db.channels.find().skip(2 * 25).limit(25)

要返回结果,mongo 必须跳过 (page - 1) * per_page 数量的结果,如果页码很高,这可能会很昂贵。假设表达式的计算结果为 1000,那么它必须运行查询,跳过 1000 个文档并获取接下来的 25 个文档(限制)。 MongoDB 本质上是对这些文档进行表扫描。

为避免这种情况,您可以进行基于范围的分页,这样可以更好地利用索引,但不允许您轻松跳转到特定页面。

例如,如果 Channel 模型有日期字段,则基于范围的分页将不使用 skip,而是使用 $gte 和 limit。您将获取 x 页上最后一个文档的日期,并通过查询上一页最终文档的日期为 $gte 的文档来获取下一页的结果。如果你这样做,你可能会被骗,所以使用不同的标准可能是有意义的。

在实践中,除非您的页面数量非常多,否则不必担心。

干杯,祝你好运!

关于ruby-on-rails - 如果我使用 will_paginate gem,mongo 查询是否仍然选择所有行然后分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9244008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com