Pregunta Paginación eficiente en SQLite con millones de registros


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

La primera opción es usar 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 paginación cuando hay muchos registros?


74
2018-01-22 21:44


origen


Respuestas:


Tenga en cuenta que siempre debe usar un ORDER BY cláusula; de lo contrario, obtienes solo un orden aleatorio.

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 se muestre la siguiente página:

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;

89
2018-01-22 22:03