Paginação eficiente em SQLite com milhões de registros

102

Preciso mostrar os resultados do SQLite em uma exibição de lista. Claro, eu preciso paginar os resultados.

A primeira opção é usar a cláusula LIMIT. Por exemplo:

SELECT * FROM Table LIMIT 100, 5000

Ele retorna os registros 5001 a 5100. O problema é que internamente o SQLite "lê" os primeiros 5000 registros e não é muito eficiente.

Qual é a melhor abordagem para paginação quando há muitos registros?

Dabiel Kabuto
fonte

Respostas:

118

Observe que você sempre deve usar uma ORDER BYcláusula; caso contrário, a ordem é arbitrária.

Para fazer uma paginação eficiente, salve os primeiros / últimos valores exibidos do (s) campo (s) ordenado (s) e continue logo após eles ao exibir a próxima página:

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

(Isso é explicado com mais detalhes no wiki SQLite .)

Quando você tem várias colunas de classificação (e SQLite 3.15 ou posterior), você pode usar uma comparação de valor de linha para isso:

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;
CL.
fonte
8
Que tal um caso onde você tem 101 valores idênticos em SomeColumn? Parece ser melhor: blog.ssokolow.com/archives/2009/12/23/…
Jacek Ławrynowicz
6
@ JacekŁawrynowicz Se a coluna de classificação não for única, você precisa classificar por mais colunas. De qualquer forma, se você tiver uma resposta alternativa, crie uma resposta.
CL.
@CL se eu quiser fazer isso com a consulta de junção, como fazer com várias condições AND
YLS
@YLS Hoje em dia, você pode usar valores de linha.
CL.
2
O problema com essa abordagem é explicado resumidamente por este comentário
mr5,