До сих пор не все понимают, почему
UUID7 это манна небесная.Обычно, при выборках по
LIMIT / OFFSET (а это основная масса всех выборок) мы упираемся в проблему однородности порядка выдачи — чтобы после первых 20 вернулись вторые 20 в том виде, в котором они были на момент на момент запроса первых, то есть, чтобы весь массив информации не менялся, пока мы его частями отдаём.Конечно же, мы для этого весь массив при каждом запросе сортируем, при этом сортируем мы по
created_at. А, так как created_at не гарантирует уникальности, мы добавлем ещё и id. А так как сортировать весь массив каждый раз долго, мы создаем составной индекс. Который составной индекс всегда большой и медленный на запись (потому что составной).Теперь, что мы имеем в
UUID7. Он велик тем, что уже содержит в себе created_at, и, более того, может по этому признаку быть отсортирован. А, кроме того, так как он UUID, он уникален.То есть это и есть
id+created_at, только в одном флаконе, и Postgres его умеет из коробки (и все последние версии Python тоже).А ещё это означает, что если мы делаем
UUID7 первичным ключом, то такие записи физически лежат на дисках последовательно. И это также значит, что мы — да, да — можем помимо основного индекса навесить на них индексацию BRIN, то есть блочную, то есть ту самую идеальную индексацию для LIMIT/OFFSET, и нам для этого даже ORDER_BY в теории писать не нужно (в теории не нужно, а на практике-то, естественно, нужно).Естественно, это не подходит, если у вас кластеризованная БД, и вы завязались на обычный арифметический ID, который постоянно умножаете и делите на номер кластера (есть такие техники, я что-то про это слышал). Но если вы из тех крутых ребят, которые вертят на колене кластеризованные БД, зачем вы вообще это читаете? (над дураками посмеяться).
Ну так и вот казалось бы — а почему тогда все вокруг его не используют? Если он такой удобный и это вопрос всего одного дополнительного индекса (быстрого и компактного)?
Да потому что до сих пор воспринимается как «новшество», все боятся «новшеств». Все чего-то ждут. А не надо ждать, надо брать и пользоваться, там всё просто и ломаться нечему. Есть, конечно, обратные примеры — типа
IPv6. Который давно принят, но никак что-то не взлетает. Потому что неудобный. Так вот, UUID7 — удобный.