Ефективна підказка в SQLite з мільйонами записів


102

Мені потрібно показати результати SQLite у вигляді списку. Звичайно, мені потрібно розмістити результати.

Перший варіант - використовувати пункт LIMIT. Наприклад:

SELECT * FROM Table LIMIT 100, 5000

Він повертає записи 5001 до 5100. Проблема полягає в тому, що внутрішньо SQLite "читає" перші 5000 записів і це не надто ефективно.

Який найкращий підхід до пейджингу, коли записів багато?

Відповіді:


118

Зверніть увагу, що ви завжди повинні використовувати 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
А як щодо випадку, коли у SomeColumn у вас 101 однаковий значення? Це, здається, краще: blog.ssokolow.com/archives/2009/12/23/…
Jacek Ławrynowicz

6
@ JacekŁawrynowicz Якщо стовпець для сортування не є унікальним, потрібно сортувати за іншими стовпцями. У будь-якому випадку, якщо у вас є альтернативна відповідь, створіть відповідь.
ЗР.

@CL, якщо я хочу це зробити із запитом приєднання, як це зробити з кількома AND умовами
YLS

@YLS Сьогодні ви можете використовувати значення рядків.
ЗР.

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