分页和替代解决方案

时间:2017-04-02 16:13:36

标签: sql database pagination

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

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

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

我对变体#1的理解是对的吗?变量#2是否在实践中使用,或者它是不好的解决方案?

1 个答案:

答案 0 :(得分:1)

变体1是接近此的“正常”方式。在许多情况下,你会对它的工作效果感到惊讶。以下是一些原因:

  • 看起来复杂的处理实际上可能非常快,特别是通过明智地使用索引。 (例如,可能没有必要进行排序。)
  • 可以在运行之间缓存查询结果。

第二种方法有一些缺点:

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

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