Аналог пагинации через OFFSET ... LIMIT
Почитал статью про оптимизацию запросов, где расписано, что при стандартном подходе пагинации через OFFSET ... LIMIT идет сканирование всей таблицы, что замедляет отработку запроса. В этой же статье предложено использовать вместо этого следующий запрос:
SELECT * FROM table_name WHERE id > 10 LIMIT 10
Вместо
SELECT * FROM table_name WHERE LIMIT 10 OFFSET 10
Но тогда как мне узнать какой отступ делать? То-есть такой способ подходит, когда первичные ключи идут последовательно и все на месте. Но если у нас отсутствуют некоторые записи или id идут непоочередно, как тогда узнать с какого id начинать выборку?
Ответы (1 шт):
Пагинация — вопрос сложныи и во многом зависящий от задачи, нагрузки, и, конечно, конкретной СУБД. Возьмите, например, эту статью о PostgreSQL. Описываются пять (!) различных способов, и каждый со своими недостатками.
В вашем случае вы можете сортировать по любому параметру, даже если есть «дырки», но при этом вы потеряете возможность переместиться на N'ую страницу. То есть, при отображении у вас будет только кнопка «Дальше», которая ведёт на страницу, где производится что-то типа:
SELECT * FROM table_name WHERE id > $last_id_on_page LIMIT 10;