【问题标题】:Pagination and alternative solution分页和替代解决方案
【发布时间】:2017-08-27 11:43:38
【问题描述】:

假设我有一个包含 10 000 行的表。一些用户(例如在网站上)希望使用此表应用一些 where 条件和 order by 条件。

变体 #1 - 使用 sql 限制和常规分页
据我了解,数据库必须 1)找到所有(!)满足 where 条件的行,2)数据库必须对所有(!)在步骤 1 找到的行进行排序,并从这些找到的行中 3)它必须返回一些由限制和偏移定义的集合。

变体 #2 - 读取列表结构中的所有 id
另一种解决方案是进行第一次查询以获取某些条件的 id 列表并按条件排序并保存。对于每个页面,我们都会得到 id 在 {..} 中的行,并在客户端按我们拥有的列表进行排序(因为数据库将以未排序的顺序返回行)。此变体的优点是不会对每一页的所有行进行过滤和排序。缺点是需要保存相当长的列表。此外,仅当数据不经常更改时才能使用此变体。

我对变体 #1 的理解正确吗?变体 #2 是在实践中使用还是不好的解决方案?

【问题讨论】:

    标签: sql database pagination


    【解决方案1】:

    变体 1 是解决此问题的“正常”方式。在许多情况下,您会惊讶于它的运行效果。以下是一些原因:

    • 看似复杂的处理实际上可能非常快,尤其是通过明智地使用索引。 (例如,排序可能不是必需的。)
    • 查询结果可能会在运行之间缓存。

    第二种方法有一些缺点:

    • 如果基础数据发生变化,ID 可能不再有效。
    • 需要预先生成整个结果集(根据 ID)。那可能很昂贵。不过,我必须承认,如果查询有 order by,这可能不会比变体 1 的第一次运行贵。
    • 所有的 id 都需要返回给应用程序。这是一个大杀手,特别是如果您可以返回大量的 ID。
    • 在返回所有行之前,应用程序无法继续处理,尽管可能有一些解决方法。

    也就是说,变体 2 在某些情况下可能是最佳解决方案。但是,更典型的解决方案是让数据库来处理分页。

    【讨论】:

    • 非常感谢您的回答。你能解释一下However, the more typical solution is to let the database handle the pagination。有变体 #3 吗?
    • @Pavel 。 . .这是您的第一种方法。
    猜你喜欢
    • 2015-07-07
    • 2019-11-23
    • 2011-02-15
    • 2011-04-13
    • 2016-10-24
    • 1970-01-01
    • 2020-08-29
    • 2016-04-30
    • 2011-02-12
    相关资源
    最近更新 更多