Измельчение JSON в Milvus: 88,9-кратное ускорение фильтрации JSON с гибкостью
Современные системы искусственного интеллекта производят больше полуструктурированных данных в формате JSON, чем когда-либо прежде. Информация о клиентах и продуктах сжимается до объекта JSON, микросервисы выдают журналы JSON при каждом запросе, IoT-устройства передают показания датчиков в виде легких полезных нагрузок JSON, а современные приложения ИИ все чаще стандартизируют JSON для структурированного вывода. В результате в векторные базы данных стекается поток JSON-подобных данных.
Традиционно существует два способа работы с документами JSON:
Предопределить каждое поле JSON в фиксированной схеме и создать индекс: Этот подход обеспечивает высокую производительность запросов, но он негибок. При изменении формата данных каждое новое или модифицированное поле вызывает очередной раунд болезненных обновлений языка определения данных (DDL) и миграций схемы.
Хранить весь объект JSON в виде одного столбца (такой подход используется и в типе JSON, и в динамической схеме Milvus): Этот вариант обеспечивает отличную гибкость, но ценой снижения производительности запросов. Каждый запрос требует разбора JSON во время выполнения и часто полного сканирования таблицы, что приводит к задержкам, которые увеличиваются по мере роста набора данных.
Раньше это была дилемма гибкости и производительности.
Теперь это не так, благодаря недавно появившейся в Milvus функции JSON Shredding.
С внедрением JSON Shredding Milvus теперь обеспечивает гибкость без схем и производительность колоночного хранилища, наконец-то делая крупномасштабные полуструктурированные данные гибкими и удобными для запросов.
Принцип работы JSON Shredding
Измельчение JSON ускоряет запросы JSON за счет преобразования документов JSON, основанных на строках, в высоко оптимизированное столбцовое хранилище. Milvus сохраняет гибкость JSON для моделирования данных, при этом автоматически оптимизируя столбцовое хранение, что значительно повышает доступ к данным и производительность запросов.
Для эффективной работы с разреженными или редкими полями JSON в Milvus также предусмотрен инвертированный индекс для общих ключей. Все это происходит прозрачно для пользователей: вы можете вставлять JSON-документы, как обычно, и предоставить Milvus самому управлять оптимальной стратегией хранения и индексирования.
Когда Milvus получает необработанные записи JSON с различными формами и структурами, он анализирует каждый ключ JSON на предмет коэффициента встречаемости и стабильности типа (является ли тип данных постоянным в разных документах). На основе этого анализа каждый ключ классифицируется в одну из трех категорий:
Типовые ключи: Ключи, которые встречаются в большинстве документов и всегда имеют один и тот же тип данных (например, все целые числа или все строки).
Динамические ключи: Ключи, которые появляются часто, но имеют смешанные типы данных (например, иногда строка, иногда целое число).
Общие ключи: Ключи, которые появляются нечасто, редко или вложенно, и их частота ниже настраиваемого порога.
Milvus обрабатывает каждую категорию по-разному, чтобы добиться максимальной эффективности:
Типизированные ключи хранятся в специальных столбцах с сильной типизацией.
Динамические ключи помещаются в динамические колонки на основе фактического типа значения, наблюдаемого во время выполнения.
Как типизированные, так и динамические столбцы хранятся в формате Arrow/Parquet columnar для быстрого сканирования и оптимизации выполнения запросов.
Общие ключи объединяются в компактный двоичный-JSON-столбец, сопровождаемый инвертированным индексом общих ключей. Этот индекс ускоряет выполнение запросов по низкочастотным полям, отсекая нерелевантные строки и ограничивая поиск только теми документами, которые содержат запрашиваемый ключ.
Эта комбинация адаптивного столбчатого хранилища и инвертированного индекса составляет основу механизма измельчения JSON в Milvus, обеспечивая гибкость и высокую производительность в масштабе.
Общая схема работы показана ниже:
Теперь, когда мы рассмотрели основные принципы работы JSON Shredding, давайте подробнее рассмотрим ключевые возможности, которые делают этот подход гибким и высокопроизводительным.
Измельчение и колонкаризация
Когда записывается новый JSON-документ, Milvus разбивает его на части и реорганизует в оптимизированное колоночное хранилище:
Типизированные и динамические ключи автоматически идентифицируются и хранятся в специальных колонках.
Если JSON содержит вложенные объекты, Milvus автоматически генерирует имена колонок на основе путей. Например, поле
nameвнутри объектаuserможет храниться с именем колонки/user/name.Общие ключи хранятся вместе в одном компактном двоичном столбце JSON. Поскольку такие ключи встречаются нечасто, Milvus строит для них инвертированный индекс, обеспечивающий быструю фильтрацию и позволяющий системе быстро находить строки, содержащие указанный ключ.
Интеллектуальное управление столбцами
Помимо измельчения JSON в столбцы, Milvus добавляет дополнительный уровень интеллекта за счет динамического управления столбцами, обеспечивая гибкость JSON Shredding по мере изменения данных.
Колонки создаются по мере необходимости: Когда во входящих документах JSON появляются новые ключи, Milvus автоматически группирует значения с одним и тем же ключом в специальный столбец. Это позволяет сохранить преимущества столбцового хранения в плане производительности, не требуя от пользователей предварительной разработки схем. Milvus также определяет тип данных новых полей (например, INTEGER, DOUBLE, VARCHAR) и выбирает для них эффективный столбцовый формат.
Каждый ключ обрабатывается автоматически: Milvus анализирует и обрабатывает каждый ключ в документе JSON. Это обеспечивает широкое покрытие запросов, не заставляя пользователей заранее определять поля или создавать индексы.
Оптимизация запросов
После реорганизации данных в нужные колонки Milvus выбирает наиболее эффективный путь выполнения для каждого запроса:
Прямое сканирование столбцов для типизированных и динамических ключей: Если запрос нацелен на поле, которое уже разделено на отдельный столбец, Milvus может сканировать этот столбец напрямую. Это позволяет сократить общий объем данных, которые необходимо обработать, и использовать ускоренные SIMD-вычисления по столбцам для еще более быстрого выполнения.
Индексированный поиск для общих ключей: Если в запросе используется поле, которое не было вынесено в отдельный столбец - как правило, это редкий ключ, - Milvus оценивает его по столбцу с общим ключом. Инвертированный индекс, построенный по этому столбцу, позволяет Milvus быстро определить, какие строки содержат указанный ключ, и пропустить остальные, что значительно повышает производительность для полей с низкой частотой встречаемости.
Автоматическое управление метаданными: Milvus постоянно поддерживает глобальные метаданные и словари, чтобы запросы оставались точными и эффективными, даже если структура входящих JSON-документов изменяется с течением времени.
Контрольные показатели производительности
Мы разработали бенчмарк для сравнения производительности запросов при хранении всего JSON-документа в виде одного необработанного поля и при использовании недавно выпущенной функции измельчения JSON.
Тестовая среда и методология
Оборудование: 1 ядро/8 ГБ кластер
Набор данных: 1 миллион документов из JSONBench
Методология: Измерение QPS и задержки для различных шаблонов запросов
Результаты: набранные ключи
В этом тесте измерялась производительность при запросе ключа, присутствующего в большинстве документов.
| Выражение запроса | QPS (без измельчения) | QPS (с измельчением) | Увеличение производительности |
|---|---|---|---|
| json['time_us'] > 0 | 8.69 | 287.5 | 33x |
| json['kind'] == 'commit' | 8.42 | 126.1 | 14.9x |
Результаты: общие ключи
В этом тесте мы сосредоточились на запросах к разрозненным вложенным ключам, которые относятся к категории "общие".
| Выражение запроса | QPS (без измельчения) | QPS (с измельчением) | Увеличение производительности |
|---|---|---|---|
| json['identity']['seq'] > 0 | 4.33 | 385 | 88.9x |
| json['identity']['did'] == 'xxxxx' | 7.6 | 352 | 46.3x |
Запросы с общим ключом демонстрируют самые значительные улучшения (до 89× быстрее), в то время как запросы с типизированным ключом стабильно ускоряются на 15-30×. В целом, каждый тип запросов выигрывает от использования JSON Shredding, причем явный прирост производительности наблюдается повсеместно.
Попробуйте прямо сейчас
Работаете ли вы с журналами API, данными датчиков IoT или быстро меняющимися полезными нагрузками приложений, JSON Shredding дает вам редкую возможность обеспечить гибкость и высокую производительность.
Функция уже доступна, и мы приглашаем вас опробовать ее прямо сейчас. Вы также можете ознакомиться с этим документом для получения более подробной информации.
У вас есть вопросы или вы хотите получить подробную информацию о любой функции последней версии Milvus? Присоединяйтесь к нашему каналу Discord или создавайте проблемы на GitHub. Вы также можете записаться на 20-минутную индивидуальную сессию, чтобы получить понимание, руководство и ответы на свои вопросы в Milvus Office Hours.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



