Обзор libmdbx
Смежные материалы: Установка и сборка · Первые шаги · Ограничения и подводные камни · Архитектура · Учебник: Том I «Основы» · Improvements
libmdbx — встраиваемая транзакционная key-value база данных с лицензией Apache-2.0: компактная, чрезвычайно быстрая, ориентированная на создание лёгких надёжных решений.
-
Позволяет рою многопоточных процессов ACID-но читать и обновлять несколько key-value таблиц и мультитаблиц в локально-разделяемой БД.
-
Обеспечивает экстраординарную производительность и минимальные накладные расходы через memory-mapping и стоимость
O(log N)операций благодаря B+tree. -
Не требует обслуживания и восстановления после сбоев — WAL не используется; это может быть нюансом для write-intensive нагрузок с требованиями долговечности (см. режимы долговечности).
-
Гарантирует сериализуемость писателей через единственный мьютекс и даёт wait-free чтение параллельным читателям, при этом чтение и запись не блокируют друг друга.
-
Гарантирует целостность данных после сбоя, если это явно не принесено в жертву скорости записи (режимы долговечности).
-
Поддерживает Linux, Windows, MacOS, HarmonyOS, Android, iOS, FreeBSD, Solaris, NetBSD, OpenBSD и другие системы, совместимые с POSIX.1-2008.
-
Компактен и дружелюбен к встраиванию — несколько плоских файлов исходников, без внутренних потоков и серверных процессов; ядро API в духе Berkeley DB с большим набором расширений.
Исторически libmdbx — глубоко переработанный потомок легендарной LMDB: наследует её достоинства, исправляет ряд проблем и добавляет большой набор доработок.
Ключевые возможности
- Key-value модель данных, ключи всегда отсортированы; диапазонные запросы с оценкой объёма результата.
- Полный ACID через MVCC и copy-on-write.
- Несколько таблиц внутри одного файла БД; эффективная поддержка мультимап (dupsort): значения отсортированы и итерируемы, ключи без дублирования.
- Данные memory-mapped и доступны напрямую (zero-copy): полный скан записей
чрезвычайно быстр;
get(key)ускоряется разделяемым lock-free кэшем. - Чтение масштабируется линейно по CPU; транзакции читателей и писателей не блокируют друг друга; нет конфликтов и дедлоков (запись сериализована).
- Онлайн-резервное копирование; append-операция для bulk-вставки предсортированных данных.
- Автоматическое изменение размера БД на лету; непрерывная zero-overhead компактация; явная дефрагментация.
- Настраиваемый размер страницы; вложенные транзакции; отсутствие WAL и журнала транзакций — обслуживание не требуется.
Ограничения (кратко)
Полный разбор — в Ограничениях и подводных камнях.
| Параметр | Значение |
|---|---|
| Размер страницы | степень двойки: 256…65536, по умолчанию 4096 |
| Размер ключа | до ≈½ страницы (2022 байт при 4K, 32742 при 64K); поддержка нулевой длины |
| Размер значения | до 0x7FF00000 байт для таблиц; ≈½ страницы для мультимап |
| Размер write-транзакции | до 4.94 ТиБ (4K-страницы), 79.1 ТиБ (64K) |
| Размер БД | до ≈8.0 ТиБ (4K), ≈128.0 ТиБ (64K) |
| Максимум таблиц | 32765 |
| Писатели | не более одной write-транзакции одновременно |
Подводные камни (кратко)
- B+tree → доступ к страницам в основном случайный: SSD дают существенный выигрыш на больших БД.
- Shadow paging вместо WAL → синхронизация может стать узким местом write-intensive нагрузок.
- MVCC + долгие читатели: параллельная активная модификация данных при долгоживущем read-транзакции увеличивает рабочий набор и может исчерпать свободное место. Избегайте долгих чтений; используйте парковку транзакций и Handle-Slow-Readers — подробнее в ограничениях.
- Чрезвычайная скорость требует внимательности: линейный поиск может оказаться выгоднее сложных индексов, а неоптимальность кода заметна только на больших данных.
Сравнение с другими БД
libmdbx превосходит легендарную LMDB по возможностям и надёжности, не уступая в производительности (детальный каталог — Improvements). Кратко по сравнению с классом встраиваемых хранилищ:
- БД разделяется несколькими процессами без мультипроцессных проблем;
- нет проблем с перемещением курсоров после удаления;
- zero-overhead компактация: файл БД может усекаться;
- без учёта дискового I/O — до ≈3× быстрее BoltDB и вплоть до 10–100 000× быстрее
BoltDB/LMDB в специальных случаях (воспроизводится ioArena,
make bench-quartet, включая сравнение с RocksDB и WiredTiger); - функционально богаче BoltDB и/или LMDB.
Когда выбирать libmdbx
✅ Подходит: локальное встраиваемое хранилище с ACID-гарантиями; много читателей и умеренная запись; требования zero-maintenance и crash-safety «из коробки»; кросс-процессный доступ в пределах одной машины; огромные мультимапы и диапазонные запросы.
⚠️ Подумайте дважды: сетевое/распределённое использование (libmdbx — не сетевая БД); write-intensive нагрузки с жёсткими требованиями долговечности на медленных носителях (узкое место — fsync, см. режимы долговечности); долгоживущие read-транзакции при активной записи (см. ограничения).
Биндинги
Полный список (несколько десятков) — в разделе Bindings and Projects главного сайта; наиболее востребованные: Rust (libmdbx-rs), Go (mdbx-go), Python (PyPi/libmdbx), .NET (libmdbx-dotnet), NodeJS (mdbxmou) и другие.