Измельчение JSONCompatible with Milvus 2.6.2+

Измельчение JSON ускоряет запросы JSON, преобразуя традиционное хранилище на основе строк в оптимизированное столбцовое хранилище. Сохраняя гибкость JSON для моделирования данных, Milvus выполняет скрытую оптимизацию столбцов, что значительно повышает эффективность доступа и запросов.

Измельчение JSON эффективно для большинства сценариев запросов к JSON. Преимущества производительности становятся более заметными при:

  • Большие, более сложные документы JSON - Больший прирост производительности по мере увеличения размера документа

  • Нагрузки, связанные с чтением - частая фильтрация, сортировка или поиск по ключам JSON.

  • Смешанные шаблоны запросов - Запросы с использованием различных ключей JSON выигрывают от применения гибридного подхода к хранению.

Как это работает

Процесс измельчения JSON происходит в три этапа, чтобы оптимизировать данные для быстрого поиска.

Этап 1: Всасывание и классификация ключей

По мере создания новых JSON-документов Milvus непрерывно отбирает и анализирует их, чтобы собрать статистику по каждому JSON-ключу. Этот анализ включает в себя коэффициент встречаемости ключа и стабильность типа (совпадает ли тип данных в разных документах).

На основе этой статистики ключи JSON классифицируются на следующие категории для оптимального хранения.

Категории ключей JSON

Тип ключа

Описание

Типовые ключи

Ключи, которые существуют в большинстве документов и всегда имеют один и тот же тип данных (например, все целые числа или все строки).

Динамические ключи

Ключи, которые встречаются часто, но имеют смешанный тип данных (например, иногда строка, иногда целое число).

Общие ключи

Нечасто появляющиеся или вложенные ключи, частота которых ниже настраиваемого порога.

Пример классификации

Рассмотрим пример JSON-данных, содержащих следующие JSON-ключи:

{"a": 10, "b": "str1", "f": 1}
{"a": 20, "b": "str2", "f": 2}  
{"a": 30, "b": "str3", "f": 3}
{"a": 40, "b": 1, "f": 4}       // b becomes mixed type
{"a": 50, "b": 2, "e": "rare"}  // e appears infrequently

На основе этих данных ключи можно классифицировать следующим образом:

  • Типизированные ключи: a и f (всегда целое число).

  • Динамические ключи: b (смешанная строка/целое число)

  • Общие ключи: e (редко встречающийся ключ).

Этап 2: Оптимизация хранения данных

Классификация, полученная на этапе 1, диктует схему хранения. Milvus использует колоночный формат, оптимизированный для запросов.

Json Shredding Flow Поток измельчения Json

  • Измельченные столбцы: Для типизированных и динамических ключей данные записываются в специальные колонки. Такое колоночное хранение позволяет быстро выполнять прямое сканирование при запросах, поскольку Milvus может считывать только необходимые данные для данного ключа, не обрабатывая весь документ.

  • Общий столбец: Все общие ключи хранятся вместе в одном компактном двоичном JSON-столбце. По этому столбцу строится инвертированный индекс общих ключей. Этот индекс имеет решающее значение для ускорения запросов по низкочастотным ключам, позволяя Milvus быстро подрезать данные, эффективно сужая пространство поиска только до тех строк, которые содержат указанный ключ.

Этап 3: Выполнение запросов

На заключительном этапе оптимизированная схема хранения данных используется для интеллектуального выбора наиболее быстрого пути для каждого предиката запроса.

  • Быстрый путь: Запросы по типизированным/динамическим ключам (например, json['a'] < 100) обращаются непосредственно к выделенным столбцам.

  • Оптимизированный путь: Запросы по общим ключам (например, json['e'] = 'rare') используют инвертированный индекс для быстрого поиска соответствующих документов.

Включить функцию измельчения JSON

Чтобы активировать эту функцию, установите common.enabledJSONShredding на true в конфигурационном файле milvus.yaml. Новые данные будут автоматически запускать процесс уничтожения.

# milvus.yaml
...
common:
  enabledJSONShredding: true # Indicates whether to enable JSON key stats build and load processes
...

После включения этой функции Milvus начнет анализировать и реструктурировать ваши JSON-данные при их поступлении без какого-либо дополнительного ручного вмешательства.

Настройка параметров

Для большинства пользователей после включения измельчения JSON достаточно настроек по умолчанию для других параметров. Однако вы можете точно настроить поведение JSON-измельчения с помощью этих параметров на странице milvus.yaml.

Имя параметра

Описание

Значение по умолчанию

Совет по настройке

common.enabledJSONShredding

Контролирует, включены ли процессы сборки и загрузки JSON-измельчения.

false

Должно быть установлено значение true, чтобы активировать функцию.

common.usingjsonShreddingForQuery

Контролирует, использует ли Milvus измельченные данные для ускорения.

true

Устанавливает значение false в качестве меры восстановления при неудачных запросах, возвращаясь к исходному пути запроса.

queryNode.mmap.jsonShredding

Определяет, использует ли Milvus mmap при загрузке измельченных данных.

Подробности см. в разделе Использовать mmap.

true

Эта настройка обычно оптимизирована для производительности. Настраивайте его только в том случае, если у вас есть особые потребности в управлении памятью или ограничения в вашей системе.

dataCoord.jsonShreddingMaxColumns

Максимальное количество JSON-ключей, которые будут храниться в измельченных столбцах.

Если количество часто встречающихся ключей превысит этот предел, Milvus будет отдавать предпочтение наиболее частым ключам для измельчения, а остальные ключи будут храниться в общей колонке.

1024

Этого достаточно для большинства сценариев. Для JSON с тысячами часто встречающихся ключей может потребоваться увеличить это значение, но следите за использованием хранилища.

dataCoord.jsonShreddingRatioThreshold

Минимальный коэффициент встречаемости ключа JSON, чтобы его можно было рассматривать для измельчения в столбец shredded.

Ключ считается часто появляющимся, если его отношение превышает этот порог.

0.3

Увеличивается (например, до 0,5), если количество ключей, удовлетворяющих критериям измельчения, превышает лимит dataCoord.jsonShreddingMaxColumns. Это делает порог более строгим, уменьшая количество ключей, удовлетворяющих критериям уничтожения.

Уменьшите значение (например, до 0,1), если вы хотите уничтожить больше ключей, которые появляются реже, чем стандартный порог 30 %.

Контрольные показатели производительности

Наше тестирование показало значительное повышение производительности при использовании различных типов ключей JSON и шаблонов запросов.

Тестовая среда и методология

  • Оборудование: 1 ядро/8 ГБ кластер

  • Набор данных: 1 миллион документов из JSONBench

  • Средний размер документа: 478,89 байт

  • Продолжительность теста: 100 секунд, измерение QPS и задержки

Результаты: набранные ключи

В этом тесте измерялась производительность при запросе ключа, присутствующего в большинстве документов.

Выражение запроса

Тип значения ключа

QPS (без измельчения)

QPS (с измельчением)

Повышение производительности

json['time_us'] > 0

Целое число

8.69

287.50

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, при этом производительность не снижается.

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ

  • Как проверить, правильно ли работает измельчение JSON?

    1. Сначала проверьте, были ли данные собраны, используя команду show segment --format table в инструменте Birdwatcher. В случае успеха в поле Json Key Stats будет указано shredding_data/ и shared_key_index/.

      Birdwatcher Output Выходные данные Birdwatcher

    2. Далее проверьте, что данные были загружены, выполнив команду show loaded-json-stats на узле запроса. На выходе вы увидите подробную информацию о загруженных измельченных данных для каждого узла запроса.

  • Что делать, если возникла ошибка?

    Если процесс сборки или загрузки завершился неудачно, вы можете быстро отключить функцию, установив common.enabledJSONShredding=false. Чтобы снять все оставшиеся задачи, используйте команду remove stats-task <task_id> в Birdwatcher. Если запрос завершился неудачно, установите common.usingjsonShreddingForQuery=false, чтобы вернуться к исходному пути запроса, минуя измельченные данные.

  • Как выбрать между измельчением JSON и индексированием JSON?

    • Измельчение JSON идеально подходит для ключей, которые часто встречаются в ваших документах, особенно для сложных структур JSON. Оно сочетает в себе преимущества столбцового хранения и инвертированного индексирования, что делает его хорошо подходящим для сценариев с интенсивным чтением, когда вы запрашиваете множество различных ключей. Однако его не рекомендуется использовать для очень маленьких JSON-документов, так как выигрыш в производительности будет минимальным. Чем меньше доля значения ключа в общем размере JSON-документа, тем лучше оптимизация производительности при измельчении.

    • Индексирование JSON лучше подходит для целенаправленной оптимизации конкретных запросов на основе ключей и имеет меньшие накладные расходы на хранение. Она подходит для более простых структур JSON. Обратите внимание, что измельчение JSON не распространяется на запросы к ключам внутри массивов, поэтому для их ускорения вам понадобится JSON-индекс.

    Подробнее см. в разделе Обзор полей JSON.