Я думаю, что StackOverflow не нужно достигать строк со смещением 10000000. Приведенный ниже запрос должен быть достаточно быстрым, если у вас есть индекс на date
и числа в предложении LIMIT
взяты из реальных примеров, а не миллионов :)
SELECT *
FROM stuff
ORDER BY date DESC
LIMIT {pageNumber}*{stuffPerPage}, {stuffPerPage}
UPDATE:
Если записи в таблице относительно редко удаляются (как в StackOverflow), тогда вы можете использовать следующее решение:
SELECT *
FROM stuff
WHERE id between
{stuffCount}-{pageNumber}*{stuffPerPage}+1 AND
{stuffCount}-{pageNumber-1}*{stuffPerPage}
ORDER BY id DESC
Где {stuffCount}
:
SELECT MAX(id) FROM stuff
Если у вас есть несколько удаленных записей в базе данных, то на некоторых страницах будет меньше записей, чем {stuffPerPage}, но это не должно быть проблемой. StackOverflow также использует некоторый неточный алгоритм. Например, попробуйте перейти на первую страницу и на последнюю страницу, и вы увидите, что обе страницы возвращают 30 записей на страницу. Но математически это чепуха.
Решения, предназначенные для работы с большими базами данных, часто используют некоторые хаки, которые обычно незаметны для обычных пользователей.
В настоящее время разбиение страниц на миллионы записей не является модным, поскольку это непрактично. В настоящее время популярно использовать бесконечную прокрутку (автоматическую или ручную с нажатием кнопки). Это имеет больше смысла, и страницы загружаются быстрее, потому что их не нужно перезагружать. Если вы считаете, что старые записи могут быть полезны и для ваших пользователей, то неплохо было бы создать страницу со случайными записями (с бесконечной прокруткой тоже). Это было мое мнение:)