Измельчение 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
Измельченные столбцы: Для типизированных и динамических ключей данные записываются в специальные колонки. Такое колоночное хранение позволяет быстро выполнять прямое сканирование при запросах, поскольку 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.
Имя параметра |
Описание |
Значение по умолчанию |
Совет по настройке |
|---|---|---|---|
|
Контролирует, включены ли процессы сборки и загрузки JSON-измельчения. |
false |
Должно быть установлено значение true, чтобы активировать функцию. |
|
Контролирует, использует ли Milvus измельченные данные для ускорения. |
true |
Устанавливает значение false в качестве меры восстановления при неудачных запросах, возвращаясь к исходному пути запроса. |
|
Определяет, использует ли Milvus mmap при загрузке измельченных данных. Подробности см. в разделе Использовать mmap. |
true |
Эта настройка обычно оптимизирована для производительности. Настраивайте его только в том случае, если у вас есть особые потребности в управлении памятью или ограничения в вашей системе. |
|
Максимальное количество JSON-ключей, которые будут храниться в измельченных столбцах. Если количество часто встречающихся ключей превысит этот предел, Milvus будет отдавать предпочтение наиболее частым ключам для измельчения, а остальные ключи будут храниться в общей колонке. |
1024 |
Этого достаточно для большинства сценариев. Для JSON с тысячами часто встречающихся ключей может потребоваться увеличить это значение, но следите за использованием хранилища. |
|
Минимальный коэффициент встречаемости ключа JSON, чтобы его можно было рассматривать для измельчения в столбец shredded. Ключ считается часто появляющимся, если его отношение превышает этот порог. |
0.3 |
Увеличивается (например, до 0,5), если количество ключей, удовлетворяющих критериям измельчения, превышает лимит Уменьшите значение (например, до 0,1), если вы хотите уничтожить больше ключей, которые появляются реже, чем стандартный порог 30 %. |
Контрольные показатели производительности
Наше тестирование показало значительное повышение производительности при использовании различных типов ключей JSON и шаблонов запросов.
Тестовая среда и методология
Оборудование: 1 ядро/8 ГБ кластер
Набор данных: 1 миллион документов из JSONBench
Средний размер документа: 478,89 байт
Продолжительность теста: 100 секунд, измерение QPS и задержки
Результаты: набранные ключи
В этом тесте измерялась производительность при запросе ключа, присутствующего в большинстве документов.
Выражение запроса |
Тип значения ключа |
QPS (без измельчения) |
QPS (с измельчением) |
Повышение производительности |
|---|---|---|---|---|
|
Целое число |
8.69 |
287.50 |
33x |
|
Строка |
8.42 |
126.1 |
14.9x |
Результаты: общие ключи
Этот тест был посвящен запросам к разрозненным вложенным ключам, которые относятся к категории "общие".
Выражение запроса |
Тип значения ключа |
QPS (без измельчения) |
QPS (с измельчением) |
Увеличение производительности |
|---|---|---|---|---|
|
Вложенное целое число |
4.33 |
385 |
88.9x |
|
Вложенная строка |
7.6 |
352 |
46.3x |
Ключевые моменты
Наиболее значительные улучшения демонстрируютобщие ключевые запросы (до 89 раз быстрее).
Типизированные ключевые запросы обеспечивают постоянный 15-30-кратный прирост производительности
Все типы запросов выигрывают от измельчения JSON, при этом производительность не снижается.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Как проверить, правильно ли работает измельчение JSON?
Сначала проверьте, были ли данные собраны, используя команду
show segment --format tableв инструменте Birdwatcher. В случае успеха в поле Json Key Stats будет указаноshredding_data/иshared_key_index/.
Выходные данные Birdwatcher Далее проверьте, что данные были загружены, выполнив команду
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.