使用数百万条记录的SQLite中的高效分页


102

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

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

SELECT * FROM Table LIMIT 100, 5000

它返回记录5001到5100。问题是SQLite在内部“读取”了前5000条记录,效率不是很高。

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

Answers:


118

请注意,您始终必须使用ORDER BY子句;否则,顺序是任意的。

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

SELECT *
FROM MyTable
WHERE SomeColumn > LastValue
ORDER BY SomeColumn
LIMIT 100;

(这在SQLite Wiki上有更详细的解释。)

当您有多个排序列(以及SQLite 3.15或更高版本)时,可以为此使用行值比较

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;

8
如果SomeColumn中有101个相同的值,该怎么办?这似乎是更好的:blog.ssokolow.com/archives/2009/12/23/...
亚采Ławrynowicz

6
@JacekŁawrynowicz如果排序列不是唯一的,则需要按更多列进行排序。无论如何,如果您有其他答案,请创建一个答案。
CL。

@CL如果我想使用联接查询来执行此操作,如何处理多个AND条件
YLS

@YLS现在,您可以使用行值。
CL。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.