Эффективное разбиение на страницы в SQLite с миллионами записей

78

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

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

SELECT * FROM Table LIMIT 100, 5000

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

Каков наилучший подход к поисковому вызову, когда есть много записей?

  • 13
    Дополнительное мнение за упоминание недостатка LIMIT A, B! :)
Теги:

1 ответ

97
Лучший ответ

Обратите внимание, что вам всегда нужно использовать предложение 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;
  • 0
    Хороший трюк, не знал об этом. И спасибо за ссылку, очень информативно!
  • 7
    Как насчет случая, когда у вас есть 101 одинаковое значение в SomeColumn? Это, кажется, лучше: blog.ssokolow.com/archives/2009/12/23/…
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню