Paginación eficiente en SQLite con millones de registros

102

Necesito mostrar los resultados de SQLite en una vista de lista. Por supuesto, necesito paginar los resultados.

La primera opción es utilizar la cláusula LIMIT. Por ejemplo:

SELECT * FROM Table LIMIT 100, 5000

Devuelve los registros 5001 a 5100. El problema es que internamente SQLite "lee" los primeros 5000 registros y no es demasiado eficiente.

¿Cuál es el mejor enfoque para la paginación cuando hay muchos registros?

Dabiel Kabuto
fuente

Respuestas:

118

Tenga en cuenta que siempre debe utilizar un ORDER BY cláusula; de lo contrario, el orden es arbitrario.

Para hacer una paginación eficiente, guarde los primeros / últimos valores mostrados de los campos ordenados y continúe justo después de ellos cuando muestre la página siguiente:

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

(Esto se explica con más detalle en la wiki de SQLite ).

Cuando tiene varias columnas de clasificación (y SQLite 3.15 o posterior), puede usar una comparación de valores de fila para esto:

SELECT *
FROM MyTable
WHERE (SomeColumn, OtherColumn) > (LastSome, LastOther)
ORDER BY SomeColumn, OtherColumn
LIMIT 100;
CL.
fuente
8
¿Qué pasa con un caso en el que tiene 101 valores idénticos en SomeColumn? Esto parece ser mejor: blog.ssokolow.com/archives/2009/12/23/…
Jacek Ławrynowicz
6
@ JacekŁawrynowicz Si la columna de clasificación no es única, debe ordenar por más columnas. De todos modos, si tiene una respuesta alternativa, cree una respuesta.
CL.
@CL si quiero hacer esto con la consulta de unión cómo hacerlo con múltiples condiciones AND
YLS
@YLS Hoy en día, puede usar valores de fila.
CL.
2
El problema al utilizar este enfoque se explica brevemente en este comentario
mr5