Milvus vs Qdrant: an open-source vector database comparison
Milvus vs Qdrant comes down to architecture: both are Apache-2.0 open-source vector databases, but Milvus separates storage from compute. Data lives in object storage, and query, ingest and index nodes scale independently to tens of billions of vectors. Qdrant runs peer nodes that keep shards on local disk, which is simpler to operate. Choose Milvus when independent scaling and index choice matter; evaluate Qdrant when you prefer peer-based deployment and its payload-filtering model.
- Apache-2.0, 40K+ GitHub stars
- Scales to tens of billions of vectors
- Storage and compute separated
- Multi-tenant vector database: partition key for millions of tenants
- Salesforce
- Walmart
- NVIDIA
- eBay
- IBM
- Cisco
- Roblox
- Exa.ai
- OpenEvidence
- Read.ai
- Plaud
- Filevine
Milvus vs Qdrant scalability: how does each grow to billions of vectors?
Milvus is built on storage-compute separation. Segments and the write-ahead log live in object storage, so a new query node loads its assigned segments instead of copying another node's disk, and ingestion, search, and indexing each scale on separate node types. Tiered storage lets a node serve more data than fits in its memory and disk.
Qdrant scalability follows a shared-nothing model: each peer stores, indexes, and serves its own shards. Qdrant's docs say self-hosted shard count cannot change without recreating the collection, new nodes start empty, and automatic rebalancing and resharding are Qdrant Cloud features; they suggest 12 shards as a common starting point.
| Capability | Milvus | Qdrant (self-hosted) |
|---|---|---|
| Architecture | Storage-compute separation: proxies, streaming, query, and data nodes | Peer nodes; Raft keeps cluster topology and collection metadata |
| Where data lives | Object storage (S3, MinIO, Azure Blob, GCS), including the WAL | Local mmap files on each node |
| Independent node scaling | Scale query, streaming, and data nodes separately | Every node stores, indexes, and serves its shards |
| Adding a node | Segments load from object storage | Starts empty until shards are moved |
| Sharding and resharding | Shard count set at creation; segments spread across any number of query nodes | Shard count fixed without recreating; resharding in Qdrant Cloud only |
| Data larger than a node | Tiered storage pulls field data on demand | Cached or cold tiers on local disk |
| Multi-tenancy at scale | Partition key for millions of tenants; database, collection, or partition per tenant | is_tenant payload index; tiered multitenancy promotes large tenants to dedicated shards |
Milvus vs Qdrant performance: which is faster?
The Milvus vs Qdrant benchmark numbers below come from the VectorDBBench leaderboard: Zilliz Cloud and self-hosted Milvus deliver several times the QPS of Qdrant Cloud at lower P99 latency, in both plain vector search and filtered search.
- Zilliz CloudZillizCloud-8cu-perf13,316.23 QPSP99 2 ms · recall 0.9383
- MilvusMilvus-16c64g-sq4u-fp16-force_merge9,575.69 QPSP99 2.3 ms · recall 0.9189
- Qdrant CloudQdrantCloud-16c64g1,242.43 QPSP99 6.4 ms · recall 0.9474
- Zilliz CloudZillizCloud-8cu-perf-partition_key10,020.53 QPSP99 2.6 ms · recall 0.9788
- MilvusMilvus-16c64g-sq8-partition_key11,280.08 QPSP99 1.6 ms · recall 0.9507
- Qdrant CloudQdrantCloud-16c64g-payload-index1,494.53 QPSP99 7.0 ms · recall 1.0
Qdrant vs Milvus features: a vector database comparison table
Both engines cover the core of modern retrieval. The difference is breadth: Milvus offers more index families for cost and hardware targets, and a server-side BM25 function for full-text search.
| Feature | Milvus | Qdrant |
|---|---|---|
| Dense vector index types | HNSW, IVF (FLAT, SQ8, PQ, RaBitQ), SCANN, DiskANN, GPU (CAGRA, IVF) | HNSW |
| Quantization | SQ8, PQ, PRQ, RaBitQ; HNSW_SQ, HNSW_PQ, HNSW_PRQ | Scalar, binary (1, 1.5, 2-bit), product, asymmetric |
| Sparse vectors | SPARSE_INVERTED_INDEX | Sparse vectors with an inverted index |
| BM25 and full-text search | Built-in BM25 function turns raw text into sparse vectors on the server | Full-text payload index; BM25 via the qdrant/bm25 model or FastEmbed, with IDF modifier |
| Hybrid search | Multiple vector fields per query, fused with RRF or weighted ranker | Query API prefetch with RRF or DBSF fusion |
| Multi-vector | Up to 10 vector fields per collection by default | Named vectors; multivectors with MAX_SIM |
| JSON / payload filtering and indexes | JSON field with JSON path index; INVERTED, BITMAP, STL_SORT scalar indexes | Keyword, integer, float, bool, geo, datetime, uuid, text indexes; filterable HNSW |
| Filter execution | Scalar filter first, then ANN search inside the matches; iterative_filter hint for complex expressions | Filterable HNSW with payload indexes |
| Multi-tenancy | Database, collection, partition, or partition key | Payload is_tenant index, custom shard keys, tiered multitenancy |
| Deployment options | Milvus Lite, Standalone, Distributed, Zilliz Cloud | Local mode, single node (Docker), cluster, Qdrant Cloud, Hybrid Cloud, Private Cloud |
| License and community | Apache-2.0; Go and C++ (Knowhere engine); LF AI & Data graduate; 40K+ GitHub stars | Apache-2.0; 30K+ GitHub stars |
| SDK languages | Python, Java, Go, Node.js, C#, C++, Rust, RESTful | Python, JavaScript/TypeScript, Rust, Go, .NET, Java |
| Framework integrations | langchain-milvus, LlamaIndex, Haystack, Dify, n8n | langchain-qdrant, llama-index-vector-stores-qdrant |
Is Milvus or Qdrant easier to self-host?
Qdrant starts with one docker run and stays one binary per node. Milvus has three deployment modes sized by data: Milvus Lite inside pymilvus, Standalone as a single container, Distributed on Kubernetes. Running cost follows where data sits: Milvus keeps segments in object storage and sizes query nodes for hot data, while every Qdrant peer holds its shards in local RAM and disk.
| Stage | Milvus | Qdrant |
|---|---|---|
| Prototype | pip install pymilvus runs Milvus Lite in-process, up to a few million vectors | docker run qdrant/qdrant, or local mode in the Python client |
| Single machine | Standalone: one container with embedded etcd, up to about 100 million vectors | One node, shards on local disk |
| Cluster | Distributed on Kubernetes (Milvus Operator or Helm) over object storage; 100 million to tens of billions | Raft peers; shard count chosen up front, 12 suggested as a start |
When is Qdrant the better choice?
Qdrant's peer-based deployment can reduce the number of service types a team operates. Choose based on shard planning, filtering, operational requirements and measured query performance, rather than treating collection size as a hard product limit.
- Data fits one node or a small cluster whose shard count you can size up front.
- You want a single Rust binary in Docker, with no object store or Kubernetes.
- Memory is tight and you want fine control over scalar, binary, product, or asymmetric quantization.
- You already run Qdrant Cloud, where rebalancing and resharding are managed for you.
- A few large SaaS tenants fit tiered multitenancy and its dedicated shards.
Milvus or Qdrant: a decision checklist
Qdrant or Milvus is rarely a feature question; both cover dense, sparse, hybrid and filtered search. It is a scale and operations question.
| Your situation | Pick |
|---|---|
| Data fits one machine and will stay there | Qdrant single node or Milvus Standalone |
| Data, tenants or traffic will outgrow one machine | Milvus Distributed: new query nodes load segments from object storage |
| Millions of tenants in one collection | Milvus partition key |
| A handful of large tenants | Qdrant tiered multitenancy, or one Milvus collection per tenant |
| Keyword and vector relevance in one query | Milvus server-side BM25 with hybrid_search; Qdrant with the qdrant/bm25 model |
| No cluster to run at all | Zilliz Cloud or Qdrant Cloud |
Which AI companies and enterprises run Milvus in production?
Milvus and Zilliz Cloud (managed Milvus) run in AI-native companies and large enterprises alike. The milvus.io adopter wall includes Salesforce, Walmart, NVIDIA, eBay, IBM, Cisco, Roblox, and Reddit, alongside Exa.ai, OpenEvidence, Read.ai, Notta.ai, Plaud, and Filevine. Published results:
- OpenEvidence: under 10 ms search latency and 4,000 QPS at peak on Zilliz Cloud.
- Plaud: 10B+ vector chunks per region with under 200 ms average recall latency.
- Exa: neural search latency cut from seconds to under 200 ms with hybrid search.
- Airtable: self-hosts Milvus on Kubernetes with the Milvus Operator for semantic search.
Customer stories
Filevine
30 billion vectors managed across millions of legal documents on Zilliz Cloud.
Read the storyMeituan
10B+ vectors in production on self-run Milvus, with 2B+ in a single collection.
Read the storyRead AI
20–50 ms retrieval latency on Milvus for millions of monthly users and million-scale active tenants.
Read the storyExplore the concepts
- What determines vector-database scalability?
- How do sharding and replication differ in a vector database?
- How do you choose a vector index for your workload?
- When should you use DISKANN in Milvus?
- What is hybrid search, and when should you use it?
- How should you design multi-tenancy for vector search?
- How should you benchmark vector search performance?
Frequently asked questions
Which is faster, Milvus or Qdrant?
On VectorDBBench Cohere 1M, Milvus-16c64g-sq8-force_merge lists 5,973 QPS at 0.9192 recall and QdrantCloud-16c64g 1,242.43 QPS at 0.9474. While ingesting 500 rows/s on 10M, QdrantCloud-16c64g lists 393.8 QPS and that Milvus configuration 306.
Can Qdrant scale to billions of vectors like Milvus?
Qdrant scales out by adding peers and shards. In self-hosted clusters the shard count is fixed at creation and new nodes start empty; resharding and automatic rebalancing are Qdrant Cloud features. Milvus Distributed is documented for tens of billions of vectors.
Is Milvus or Qdrant easier to self-host?
A single Qdrant node is one binary, so it starts fastest. Milvus Lite (pip install) and Standalone (one container with embedded etcd) are as simple; Distributed adds Kubernetes and object storage in exchange for scaling each node type on its own.
Is Milvus overkill under 100 million vectors?
No. Milvus Standalone is documented for up to about 100 million vectors in one container, and Milvus Lite for a few million inside Python. Kubernetes only enters with Distributed.
Can I migrate from Qdrant to Milvus?
Yes. VTS (Vector Transport Service) lists Qdrant as a source connector, so collections, vectors and payloads copy over without re-embedding. Map payload fields to scalar or JSON fields, build indexes, then dual-write until results match.
Is Milvus or Qdrant better for production RAG?
Both handle RAG retrieval with filtering and hybrid search, so the best open source vector database for RAG depends on scale. Milvus adds server-side BM25, more index types, and partition-key multi-tenancy, which matter as corpora and tenant counts grow. Qdrant suits smaller, stable collections.
Sources and technical documentation (44)
- https://milvus.io
- https://github.com/milvus-io/milvus
- https://milvus.io/docs/architecture_overview.md
- https://milvus.io/docs/install-overview.md
- https://milvus.io/docs/scaleout.md
- https://milvus.io/docs/tiered-storage-overview.md
- https://milvus.io/docs/create-collection.md
- https://milvus.io/docs/index-explained.md
- https://milvus.io/docs/full-text-search.md
- https://milvus.io/docs/multi-vector-search.md
- https://milvus.io/docs/json-indexing.md
- https://milvus.io/docs/multi_tenancy.md
- https://github.com/qdrant/qdrant
- https://qdrant.tech/documentation/scaling/distributed_deployment/
- https://qdrant.tech/documentation/scaling/horizontal-scaling/
- https://qdrant.tech/documentation/concepts/indexing/
- https://qdrant.tech/documentation/guides/quantization/
- https://qdrant.tech/documentation/concepts/storage/
- https://qdrant.tech/documentation/concepts/vectors/
- https://qdrant.tech/documentation/concepts/hybrid-queries/
- https://qdrant.tech/documentation/search/text-search/full-text-search/
- https://qdrant.tech/documentation/guides/multiple-partitions/
- https://qdrant.tech/course/beginners/module-4/where-it-runs/
- https://zilliz.com/vdbbench-leaderboard
- https://github.com/zilliztech/VectorDBBench
- https://github.com/zilliztech/VectorDBBench/blob/main/vectordb_bench/results/leaderboard_v2.json
- https://github.com/zilliztech/VectorDBBench/blob/main/vectordb_bench/results/leaderboard_v2_streaming.json
- https://zilliz.com/customers/filevine
- https://zilliz.com/customers/openevidence
- https://zilliz.com/customers/exa
- https://zilliz.com/customers/airtable
- https://zilliz.com/customers/plaud
- https://zilliz.com/customers/read-ai
- https://zilliz.com/customers/meituan
- https://milvus.io/docs/quickstart.md
- https://qdrant.tech/documentation/quickstart/
- https://qdrant.tech/documentation/frameworks/langchain/
- https://qdrant.tech/documentation/frameworks/llama-index/
- https://milvus.io/docs/install_standalone-docker.md
- https://milvus.io/docs/filtered-search.md
- https://milvus.io/docs/integrations_overview.md
- https://github.com/zilliztech/knowhere
- https://github.com/zilliztech/vts
- https://lfaidata.foundation/projects/