IngoDB - адаптивная AI-native база данных
- title
- IngoDB - адаптивная AI-native база данных
- type
- summary
- summary
- Самотрансформирующееся LSM-хранилище документов на Rust: реактивное индексирование по паттернам запросов, Liquid AST для AI-агентов
- tags
- databases, lsm-tree, rust, ai-agents
- sources
- ingodb-ai-native-database
- created
- 2026-04-09
- updated
- 2026-07-22
- lang
- ru
- translation_of
- ingodb
- source_updated
- 2026-07-22
- translated
- 2026-09-01
- translator
- lllm/antigravity/gemini-3.7-flash-medium
Анонс IngoDB от Хенрика Инго (Henrik Ingo) - самотрансформирующегося движка хранения документов на Rust, построенного на архитектуре lsm-tree. Основная идея: база данных отслеживает паттерны запросов и автоматически создаёт индексы, избавляя от необходимости вручную проектировать схему или настраивать СУБД с DBA. Проект позиционируется как "AI-native" - он и рассчитан на запросы от AI-агентов, и частично написан одним из них.
Архитектура
В основе IngoDB лежит движок LSM-tree. Записи идут стандартным путём: MemTable в памяти, сброс в неизменяемые SSTable на диске, фоновая компактизация для слияния и очистки. В качестве стратегии компактизации используется Cassandra Unified Compaction Strategy (UCS), управляемая единственным параметром W, который задаёт баланс между read amplification и write amplification. IngoDB адаптивно подстраивает W под текущую нагрузку.
Поверх фундамента LSM движок выделяют три вещи:
Запросы через Liquid AST. Никакого SQL. Запросы представляют собой структуры данных Rust - enum'ы и struct'ы, описывающие фильтры, проекции и обходы графа. Это сделано для того, чтобы AI-агенты и код приложений могли формировать запросы программно, избегая неоднозначностей парсинга SQL. Это интересная ставка: SQL появился потому, что людям нужен читаемый язык, но если основной автор запросов - LLM или агент, типизированный AST может оказаться более удобным интерфейсом.
Реактивное индексирование. Каждый запрос собирает статистику: по каким полям шла фильтрация, сколько документов было просканировано относительно возвращённого объёма, какова была задержка. Когда движок замечает повторяющийся паттерн с низкой селективностью (сканируется много документов, а возвращается мало), он создаёт вторичный SSTable, отсортированный по полю фильтра. Следующий запрос по тому же паттерну попадает в бинарный поиск вместо полного сканирования. Накладные расходы практически нулевые: данные всё равно сортировались бы во время компактизации, поэтому движок просто сортирует их по другому ключу. Дальнейшая компактизация поддерживает эти вторичные индексы в актуальном состоянии.
Ad-hoc обход графов. Любое поле во время выполнения запроса может стать ребром графа. Конструкция Traverse { from_field: "user_id", to_field: "_id", depth: 2 } обходит связи без предварительного объявления внешних ключей или специальных типов указателей. Это позволяет работать с документоориентированным хранилищем как с неявным графом.
Конкурентность
Изоляция снимков (snapshot isolation) через MVCC с использованием UUIDv7 в качестве идентификаторов версий. Читатели видят согласованное состояние на определённый момент времени, пока писатели продолжают работу параллельно. Упорядоченность UUIDv7 по времени означает, что версии сортируются хронологически без дополнительных метаданных.
Snapshot isolation - это конкретная точка в пространстве решений, где также находятся двухфазная блокировка, оптимистичное управление и варианты serializable snapshot; статья Грэфе (Graefe) on-transactional-concurrency-control объединяет их все в рамках одной модели и служит компактным ориентиром для понимания того, от чего отказывается движок хранения, выбирая тот или иной вариант.
Бенчмарки
На 1 миллионе документов с товарами:
| Операция | Пропускная способность |
|---|---|
| Ingest (batch=1000) | 210 - 235K docs/sec |
| Точечные выборки | 56K ops/sec, p50=14µs |
| Первое сканирование (без индекса) | 3.9s на 100K результатов |
| Второе сканирование (с реактивным индексом) | 1.8s (в 2.2 раза быстрее) |
| Конкурентный доступ в 8 потоков | 413K ops/sec |
| Смешанное чтение/запись | 72K ops/sec |
Write amplification измерен на уровне 0.72x благодаря адаптивной настройке W: движок записал на диск меньше сырого объёма данных за счёт эффективного дельта-сжатия и компактизации.
Написано за неделю
Вся кодовая база (~10K строк, 7 Rust-crate'ов, 170 тестов) была создана в формате парного программирования между Инго и Claude примерно за неделю. Инго принимал архитектурные решения и отлавливал огрехи проектирования; Claude генерировал рабочую реализацию. Это ещё один аргумент в дискуссии о "разработке с помощью ИИ" - полноценный движок хранения, а не игрушечный проект, созданный в ходе дисциплинированного сотрудничества человека и ИИ.
Планы развития
- Принятие решений о создании/удалении индексов и настройке компактизации на базе нейросетей
- Семантический shredding: извлечение часто запрашиваемых полей в колоночный формат во время компактизации
- Co-location: совместное размещение связанных документов на основе наблюдаемых паттернов обхода
- Пользовательские компараторы на WASM и сетевой доступ через gRPC
См. также
- lsm-tree - базовая архитектура хранения
- lsm-trees-nosql - вводное объяснение LSM-деревьев
- building-syntaqlite-ai - ещё один проект базы данных, созданный с помощью ИИ, с другими выводами о процессе