SQLite中具有数百万条记录的高效分页

Dab*_*uto 96 sqlite

我需要在列表视图中显示SQLite结果.当然,我需要分页结果.

第一种选择是使用LIMIT子句.例如:

SELECT * FROM Table LIMIT 100, 5000
Run Code Online (Sandbox Code Playgroud)

它返回记录5001到5100.问题是内部SQLite"读取"前5000条记录并且效率不高.

当有大量记录时,分页的最佳方法是什么?

CL.*_*CL. 113

请注意,您必须始终使用ORDER BY条款; 否则,你得到一些随机的订单.

要进行有效的分页,请保存已排序字段的第一个/最后一个显示值,并在显示下一个页面后继续它们:

SELECT *
FROM MyTable
WHERE SomeColumn > LastValue
ORDER BY SomeColumn
LIMIT 100;
Run Code Online (Sandbox Code Playgroud)

(这在SQLite wiki上有更详细的解释.)

如果有多个排序列(以及SQLite 3.15或更高版本),则可以使用行值比较:

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;
Run Code Online (Sandbox Code Playgroud)

  • 在SomeColumn中有101个相同值的情况怎么样?这似乎更好:http://blog.ssokolow.com/archives/2009/12/23/sql-pagination-without-offset/ (7认同)
  • @JacekŁawrynowicz如果排序列不是唯一的,则需要按更多列排序.无论如何,如果你有另一个答案,请创建一个答案. (5认同)
  • 使用此方法的问题由[此评论]简要解释(/sf/ask/313697191/#comment31211780_16935313) (2认同)