Эффективная подкачка в SQLite с миллионами записей


102

Мне нужно показать результаты SQLite в виде списка. Конечно, мне нужно публиковать результаты.

Первый вариант - использовать предложение LIMIT. Например:

SELECT * FROM Table LIMIT 100, 5000

Он возвращает записи с 5001 по 5100. Проблема в том, что внутри SQLite «читает» первые 5000 записей, и это не слишком эффективно.

Как лучше всего использовать разбиение на страницы при большом количестве записей?

Ответы:


119

Обратите внимание, что вы всегда должны использовать ORDER BYпредложение; в противном случае порядок произвольный.

Для эффективного разбиения по страницам сохраните первое / последнее отображаемые значения упорядоченного поля (полей) и продолжайте сразу после них при отображении следующей страницы:

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

(Это объясняется более подробно в вики по SQLite .)

Если у вас есть несколько столбцов сортировки (и SQLite 3,15 или более поздняя версия), вы можете использовать сравнение значений строки для этого:

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

8
Как насчет случая, когда у вас есть 101 идентичное значение в SomeColumn? Кажется, так лучше: blog.ssokolow.com/archives/2009/12/23/…
Яцек Лавринович

6
@ JacekŁawrynowicz Если столбец сортировки не уникален, вам необходимо выполнить сортировку по большему количеству столбцов. В любом случае, если у вас есть альтернативный ответ, создайте ответ.
кл.

@CL, если я хочу сделать это с помощью запроса соединения, как это сделать с несколькими условиями И
YLS

@YLS В настоящее время вы можете использовать значения строк.
кл.

2
Проблема с использованием этого подхода кратко объясняется в этом комментарии
mr5
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.