Diagnoses and fixes slow Qdrant search. Use when someone reports 'search is slow', 'high latency', 'queries take too long', 'low QPS', 'throughput too low', 'filtered search is slow', or 'search was fast but now it's slow'. Also use when search performance degrades after config changes or data growth.
There are multiple possible reasons for search performance degradation. The most common ones are:
hnsw_ef, complex filters without payload index)Use when: individual queries take too long regardless of load.
with_payload: false and with_vectors: false to see if payload retrieval is the bottleneckdatatype: turbo4 (4-bit, about 8x smaller) to cut disk reads. Lossy: the originals are no longer full precision, so check recall. Set it when creating the collection or adding a new named vector, so existing data must be re-ingested turbo4Use when: system can't serve enough queries per second under load.
default_segment_number to 2) Maximizing throughputUse when: filtered search is significantly slower than unfiltered. Most common SA complaint after memory.
is_tenant=true for primary filtering condition: Tenant indexnested filter conditions check each remaining candidate's payload element by element, which is slow when many candidates remain. On Qdrant 1.20 or newer, create per-element indexes (the nested parameter of the payload index) on every field the nested filter uses, so Qdrant answers it from the indexes without reading payload Per-element index.match with substring, 1.20+) is expensive: it checks every distinct value of the field, and Qdrant rejects it whenever strict mode is enabled (the Qdrant Cloud default). Prefer prefix match (keyword index with prefix: true) or full-text match where the use case allows. A keyword index, especially with prefix, speeds it up; a full-text index doesn't help Substring matchindexed_only=true parameter, if the query is significantly faster, it means that the optimizer is still running and has not yet indexed all segments.optimizer_cpu_budget to reserve more CPU for queriesprevent_unoptimized=true to prevent creating segments with a large amount of unindexed data for searches. Instead, once a segment reaches the so called indexing_threshold, all additional points will be added in ‘deferred state’.Learn more in the read-write contention guide
memory: cold/cached on Qdrant 1.19 or newer; on 1.18 or older, avoid leaving always_ram false or unset while the original vectors are on_disk: trueskillbazaar install qdrant-search-speed-optimization --agent claudeSign in (free) to install skills with the CLI.
Author
@qdrant
on GitHub
Published by