FAQ по производительности
Как установить nlist
и nprobe
для индексов ЭКО?
Настройка nlist
зависит от конкретного сценария. Как правило, рекомендуемое значение nlist
равно 4 × sqrt(n)
, где n
- общее количество сущностей в сегменте.
Размер каждого сегмента определяется параметром datacoord.segment.maxSize
, который по умолчанию установлен на 512 МБ. Общее количество сущностей в сегменте n можно определить, разделив datacoord.segment.maxSize
на размер каждой сущности.
Настройка параметра nprobe
зависит от набора данных и сценария и предполагает компромисс между точностью и производительностью запроса. Мы рекомендуем найти идеальное значение путем многократных экспериментов.
На следующих диаграммах представлены результаты теста, проведенного на наборе данных sift50m и индексе IVF_SQ8, в котором сравниваются показатели запоминания и производительности запросов для различных пар nlist
/nprobe
.
Тест на точность
Тест на производительность
Почему на небольших наборах данных запросы иногда выполняются дольше?
Операции запроса выполняются на сегментах. Индексы сокращают время, необходимое для запроса сегмента. Если сегмент не проиндексирован, Milvus прибегает к грубому поиску по исходным данным, что резко увеличивает время запроса.
Таким образом, запрос к небольшому набору данных (коллекции) обычно занимает больше времени, поскольку индекс не был создан. Это происходит потому, что размеры ее сегментов не достигли порога построения индекса, установленного на rootCoord.minSegmentSizeToEnableindex
. Вызовите create_index()
, чтобы заставить Milvus индексировать сегменты, которые достигли порога, но еще не были автоматически проиндексированы, что значительно повысит производительность запросов.
Какие факторы влияют на использование процессора?
Использование ЦП увеличивается, когда Milvus строит индексы или выполняет запросы. В целом построение индексов требует больших затрат ЦП, за исключением использования Annoy, который работает в один поток.
При выполнении запросов на использование ЦП влияют nq
и nprobe
. Когда nq
и nprobe
невелики, параллелизм незначителен и загрузка процессора остается низкой.
Влияет ли одновременная вставка данных и поиск на производительность запросов?
Операции вставки не требуют больших затрат ЦП. Однако, поскольку новые сегменты могут не достигнуть порога для построения индекса, Milvus прибегает к поиску методом грубой силы, что значительно влияет на производительность запроса.
Параметр rootcoord.minSegmentSizeToEnableIndex
определяет порог построения индекса для сегмента и по умолчанию установлен на 1024 строки. Дополнительные сведения см. в разделе Конфигурация системы.
Может ли индексирование поля VARCHAR повысить скорость удаления?
Индексирование поля VARCHAR может ускорить операции "Удаление по выражению", но только при определенных условиях:
- ИНВЕРТИРОВАННЫЙ индекс: Этот индекс помогает при использовании
IN
или==
выражений для полей VARCHAR, не являющихся первичными ключами. - Тройной индекс: Этот индекс помогает при префиксных запросах (например,
LIKE prefix%
) на непервичных полях VARCHAR.
Однако индексирование поля VARCHAR не ускоряет работу:
- Удаление по идентификаторам: Когда поле VARCHAR является первичным ключом.
- Несвязанные выражения: Когда поле VARCHAR не является частью выражения удаления.
У вас остались вопросы?
Вы можете:
- Проверить Milvus на GitHub. Не стесняйтесь задавать вопросы, делиться идеями и помогать другим.
- Присоединяйтесь к нашему каналу Slack, чтобы найти поддержку и взаимодействовать с нашим сообществом разработчиков с открытым исходным кодом.