UUID v4 против UUID v7: влияние на индексы B-Tree в БД
Классический UUID v4 на основе 122 бит случайности десятилетиями служил стандартом распределённых систем, но стал кошмаром для реляционных баз данных. В 2024 году IETF ратифицировал стандарт RFC 9562 с поддержкой UUID v7. Разбираем, почему v7 кардинально ускоряет INSERT в таблицы с миллиардами строк.
Проблема фрагментации B-Tree индексов при использовании UUID v4
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)
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 бита): чистая криптографическая энтропия.
Сравнение производительности: тесты вставок
• 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 устраняет необходимость в компромиссах между распределённой безопасностью и скоростью СУБД.
Попробуйте онлайн-инструменты по этой теме
Используйте бесплатные утилиты Utilora прямо в браузере без регистрации:
Генератор UUID
Создание криптографически стойких уникальных идентификаторов UUID v4 (GUID) по стандарту RFC 9562.
Запустить ▸Хэш-генератор
Мгновенное вычисление криптографических хэшей MD5 (RFC 1321), SHA-1, SHA-256 и SHA-512 в браузере с аппаратным ускорением Web Crypto API.
Запустить ▸Base64 Кодер / Декодер
Кодирование текста и файлов в Base64 и обратное декодирование с корректной поддержкой UTF-8 кириллицы.
Запустить ▸Часто задаваемые вопросы (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+.