Добавляем себе в коллекцию граблей
habr.com/ru/companies/ruvds/ar…
Не стоит пользоваться OFFSET и LIMIT в запросах с разбиением на страницы
Прошли те дни, когда не надо было беспокоиться об оптимизации производительности баз данных. Время не стоит на месте. Каждый новый бизнесмен из сферы высоких тех...ru_vds (Habr)
Мертвый голубь Стаса
в ответ на mrcopperbeard • • •D:\side\
в ответ на Мертвый голубь Стаса • • •@hardworm на самом деле, возможно. Но под это лучше закладываться заранее (совет наиболее актуален на этапе, когда в продакшене ещё ничего нет), или готовиться к болезненной миграции (но ползающая по-черепашьи база прямо сейчас может быть ещё больнее).
UUID по сути просто 128-битные числа в прикольной обёртке. И если часть старших бит отвести под таймстемп, то их можно сортировать. В распределённых бэкендах это довольно популярный трюк.
Проблема, кстати, только в offset, причём только с большими его значениями. К limit никаких претензий.
@mrcopperbeard
cauf 🇷🇺
в ответ на D:\side\ • • •@dside @hardworm
> И если часть старших бит отвести под таймстемп, то их можно сортировать.
О, поздравляю, ты только что UUIDv7 придумал! Осталось дождаться реализации с pgsql и можно ничего не делать
D:\side\
в ответ на cauf 🇷🇺 • • •я его не то чтобы придумал, таймстемп в старших битах был ещё в UUIDv1 (2005)
datatracker.ietf.org/doc/html/…
В постгресе v1 уже есть, даже с функцией доставания таймстемпа и даже вариант, использующий случайный мультикаст-MAC вместо реального MAC:
postgresql.org/docs/current/fu…
postgresql.org/docs/current/uu…
…не на все биты, конечно, но их и так там больше, чем реалистично потребуется.
@hardworm @mrcopperbeard
9.14. UUID Functions
PostgreSQL DocumentationМертвый голубь Стаса
в ответ на D:\side\ • • •D:\side\
в ответ на Мертвый голубь Стаса • • •штука в том, что "хочу открыть 99 страницу" это практически не существующий в пользовательских нуждах случай. Но можно предусмотреть автоматическое листание на сервере, если такая экзотическая нужда имеется.
А оффсет в постгресе быстрее O(N) вряд ли когда-либо станет.
@mrcopperbeard
Мертвый голубь Стаса
в ответ на D:\side\ • • •@dside это в ваших лентах котиков это не существующий кейс.
А в корпоративных сервисах это просто must have. Если пользователь хочет открыть 99 страницу, он должен открыт 99 страницу. И более того должен мочь поделится 99 страницей на которой увидят тот же набор данных
D:\side\
в ответ на Мертвый голубь Стаса • • •@hardworm работал я над этими вашими корпоративными сервисами лет 7 — они ещё очень не любят, когда база тормозит, ага.
А когда в ссылке since=42042 вместо page=99, результаты получатся даже стабильнее, т. к. не поедут, если в начало списка вставится ещё несколько элементов.
@mrcopperbeard
mrcopperbeard
в ответ на D:\side\ • • •ХаББыватель
в ответ на mrcopperbeard • •Мя :sparkles_lesbian:
в ответ на ХаББыватель • • •@hubbitant не, с удалением тоже работает. Смотри:
- клиент запрашивает первые 50 записей
- получает вместе с данными поле next=61 (часть из первых строк удалили)
- клиент запрашивает следующие записи, передавая since=61
Минус тут в том, что теперь уже клиент не сможет нормально сходу запросить «страницу 16»
@mrcopperbeard
Мя :sparkles_lesbian:
в ответ на Мя :sparkles_lesbian: • • •@hubbitant btw, ровно такой способ пагинации у мастодона
@mrcopperbeard
ХаББыватель
в ответ на Мя :sparkles_lesbian: • •Спасибо за разъяснение.
Вообще может иметь смысл при последовательной загрузке контента, но не работоспособно в классической пагинации (как на картинке у автора статьи).
D:\side\
в ответ на ХаББыватель • • •@hubbitant работоспособно. Сервер может точно так же выбрать несколько ближайших страниц и вычислить нужные клиенту ключи для каждой кнопки.
Это, увы, подзамедлит выборку и первых страниц тоже, зато по мере углубления в результаты стоимость запросов не будет линейно расти, как при оффсетах.
Но можно копнуть ещё глубже и подумать, а нужны ли вообще пользователю номера страниц — или ему актуальнее контекст вокруг конкретного сообщения и листание вперёд-назад.
Крч узким местом скорее всего станет жаркий спор между разработчиками и привычками продуктовика к древним ленточкам номеров страниц
@mo @mrcopperbeard
ХаББыватель нравится это.