developer • 6 мин чтения • Обновлено: 2026-09-20

UUID v4 против UUID v7: влияние на индексы B-Tree в БД

Классический UUID v4 на основе 122 бит случайности десятилетиями служил стандартом распределённых систем, но стал кошмаром для реляционных баз данных. В 2024 году IETF ратифицировал стандарт RFC 9562 с поддержкой UUID v7. Разбираем, почему v7 кардинально ускоряет INSERT в таблицы с миллиардами строк.

Проблема фрагментации B-Tree индексов при использовании UUID v4

В реляционных СУБД (PostgreSQL, MySQL InnoDB, SQLite) первичный ключ таблицы id по умолчанию организован в виде сбалансированного дерева B-Tree или B+Tree:

1. При автоинкрементном числовом ID (BIGINT) новые записи последовательно дописываются в конец крайней правой страницы памяти B-Tree (Append-only). Затраты на балансировку минимальны.
2. При использовании UUID v4 значение вычисляется из криптографического ГСЧ (crypto.getRandomValues). Очередной сгенерированный ID попадает в совершенно случайный диапазон дерева.
3. Когда страница B-Tree переполняется, СУБД вынуждена выполнять операцию расщепления страницы (Page Split) — выделять новую страницу, делить пополам массив узлов и перебалансировать дерево. Это приводит к дисковому I/O, разрастанию размера файла таблицы на 40–60% и падению скорости массовых вставок (INSERT throughput) в 4–10 раз при росте объёма таблицы выше размера буферного пула RAM.

Полезный инструмент: Сгенерировать криптографически стойкие идентификаторы прямо сейчас позволяет наш генератор UUID v4.

Полезный инструмент: Поскольку версия UUID v7 использует метку времени, для перевода миллисекунд полезен Unix Timestamp конвертер.

Полезный инструмент: Для хеширования идентификаторов применяйте генератор криптографических хэшей.

Анатомия и битовая раскладка UUID v7 (RFC 9562)

UUID версии 7 объединяет монотонную сортировку по времени Unix Timestamp с криптографической энтропией:

0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unix_ts_ms |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| unix_ts_ms | ver | rand_a |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|var| rand_b |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| rand_b |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Ключевые поля структуры:
• unix_ts_ms (48 бит): текущее время в миллисекундах от эпохи Unix (хватит до 10889 года нашей эры);
• ver (4 бита): константа 0b0111 (версия 7);
• rand_a (12 бит): случайные биты или субмиллисекундный счётчик последовательности;
• var (2 бита): вариант 0b10 по стандарту RFC 9562;
• rand_b (62 бита): чистая криптографическая энтропия.

Сравнение производительности: тесты вставок

Инженерные бенчмарки на таблице с 50 000 000 строк (PostgreSQL 16, NVMe SSD):

• BIGSERIAL (целые числа): эталонная скорость ~48 000 вставок/сек, размер индекса 1.1 ГБ;
• UUID v4 (random): просадка скорости до ~8 500 вставок/сек при заполнении буферного кэша, размер индекса 2.8 ГБ (фрагментация 62%);
• UUID v7 (time-sorted): скорость ~44 000 вставок/сек (92% от скорости целых чисел!), размер индекса 1.3 ГБ (фрагментация менее 4%).

UUID v7 устраняет необходимость в компромиссах между распределённой безопасностью и скоростью СУБД.

Часто задаваемые вопросы (FAQ)

Да, наш онлайн-генератор UUID использует стандартный Web Crypto API `crypto.randomUUID()`, который генерирует криптографически стойкие 122 бита энтропии без передачи данных на сервер.

UUID v1 содержал физический MAC-адрес сетевой карты и время в 100-наносекундных интервалах с эпохи 1582 года. Из-за утечки MAC-адреса и неудачного порядка байт (младшие биты шли первыми) он создавал риски приватности и всё равно плохо сортировался.

Да, библиотеки для UUID v7 уже встроены или доступны в Python (uuid_utils), Node.js, Go, Rust, Java и PHP 8.4+.

Скопировано в буфер обмена!