Skip to content

Обзор libmdbx

Смежные материалы: Установка и сборка · Первые шаги · Ограничения и подводные камни · Архитектура · Учебник: Том I «Основы» · Improvements

libmdbx — встраиваемая транзакционная key-value база данных с лицензией Apache-2.0: компактная, чрезвычайно быстрая, ориентированная на создание лёгких надёжных решений.

  1. Позволяет рою многопоточных процессов ACID-но читать и обновлять несколько key-value таблиц и мультитаблиц в локально-разделяемой БД.

  2. Обеспечивает экстраординарную производительность и минимальные накладные расходы через memory-mapping и стоимость O(log N) операций благодаря B+tree.

  3. Не требует обслуживания и восстановления после сбоев — WAL не используется; это может быть нюансом для write-intensive нагрузок с требованиями долговечности (см. режимы долговечности).

  4. Гарантирует сериализуемость писателей через единственный мьютекс и даёт wait-free чтение параллельным читателям, при этом чтение и запись не блокируют друг друга.

  5. Гарантирует целостность данных после сбоя, если это явно не принесено в жертву скорости записи (режимы долговечности).

  6. Поддерживает Linux, Windows, MacOS, HarmonyOS, Android, iOS, FreeBSD, Solaris, NetBSD, OpenBSD и другие системы, совместимые с POSIX.1-2008.

  7. Компактен и дружелюбен к встраиванию — несколько плоских файлов исходников, без внутренних потоков и серверных процессов; ядро 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) и другие.