
Milvus 索引内存与磁盘混合存储DiskANN 索引原理解析在分布式向量数据库 Milvus 中当业务的数据规模从千万级跨越至数亿乃至数十亿条高维向量如 10 亿条 768 维向量时传统的纯内存图索引HNSW会遭遇不可逾越的“物理内存成本天花板”1 亿条 768 维向量仅原始数据就占 300GB 内存加上 HNSW 的双向图指针拓扑与开销物理内存消耗高达550 GB 以上10 亿条向量需要消耗超过5.5 TB 的高规格物理内存单月云服务器硬件租金高达数十万元。而在现代云原生硬件体系中NVMe SSD 固态硬盘的每 GB 成本仅为内存DRAM的1/10 ~ 1/15且具备高达数 GB/s 的并发随机读取吞吐。由微软研究院Microsoft Research提出、并被 Milvus 深度集成的DiskANN基于磁盘的高性能近似最近邻图索引正是解决“十亿级超大规模向量检索内存爆炸”的革命性工业解法。DiskANN 是如何在**“仅使用 1/5 物理内存”**的前提下利用 NVMe SSD 磁盘实现与纯内存 HNSW几乎完全一致的超高召回率Recall $\ge 95%$与毫秒级查询延迟Latency $\le 10\text{ms}$的DiskANN 内存与磁盘混合存储的底层物理拓扑Vamana 图结构DiskANN 的核心创新在于打破了“全图必须常驻内存”的传统范式构建了基于Vamana 图结构与压缩向量Compressed Vectors的两级物理布局----------------------- 物理内存空间 (DRAM - 仅占用总数据的 15%~20%) ----------------------- | 1. 压缩量化向量集 (Compressed Vectors / PQ 乘积量化编码): 用于在内存中极速粗估距离 | | 2. Vamana 图最顶层核心导航节点缓存 (Cached Top-Layer Graph Hub Nodes): 负责全局宏观路由 | -------------------------------------------------------------------------------------------- | v 内存粗筛定位目标扇区 (Memory Probing) ----------------------- NVMe SSD 磁盘物理文件 (Disk Storage - 承载 80%~85% 数据) --------------- | 1. 完整的全精度原始向量 (Full-Precision FP32 Raw Vectors) | | 2. 完整的底层密集邻居指针图 (Vamana Fine Graph Edges Adjacency Lists) | | 3. 利用 Linux 异步 I/O (io_uring / libaio) 实现每次仅读取目标页面的微秒级 SSD 随机点查 | ---------------------------------------------------------------------------------------------DiskANN 检索执行的四阶段物理时序[ 用户发起向量查询: Search(query_vec, top_k10) ] | v ------------------------- 阶段一: 内存级极速粗筛导航 (In-Memory PQ Search) ------------------------- | 1. 从内存中的 Vamana 核心导航起点开始 | | 2. 在内存中利用极度紧凑的 PQ 压缩向量以极快速度进行欧氏距离近邻粗估 | | 3. 快速贪心跳跃在毫秒之内将搜索范围收敛至目标近邻小局部区域 (锁定候选节点 ID 集合) | ------------------------------------------------------------------------------------------ | v ------------------------- 阶段二: 异步磁盘扇区点查 (Asynchronous NVMe SSD I/O) -------------------- | 1. 使用 Linux 高性能异步 I/O (io_uring) 并发向 NVMe SSD 发出定向扇区读取请求 | | 2. 仅从 SSD 磁盘精准读取这几十个候选节点的【全精度原始向量】与【局部邻居列表】 (单次 I/O 0.2ms) | ------------------------------------------------------------------------------------------ | v ------------------------- 阶段三: 全精度精细重排与局部图重校 (Full-Precision Reranking) ------------ | 1. 利用从磁盘读出的 FP32 全精度真实向量对候选集执行无损精确几何距离打分 | | 2. 沿着磁盘邻居指针在局部图上做最后的微调探查 | | 3. 产出最终全局最优的 Top-K 结果 | ---------------------------------------------------------------------------------------------------1 亿条 768 维向量规模下的综合实测对照表测试环境单台 64 核服务器配备 1TB NVMe PCIe 4.0 SSDMilvus 2.4索引算法与存储架构物理内存占用 (DRAM)NVMe SSD 磁盘占用Recall10 召回率单次检索 P99 延迟硬件服务器月租成本纯内存 HNSW (M16, efC200)534.0 GB (极度昂贵)0 GB98.2%4.2 ms¥ 18,500 元 / 月纯内存 IVF_FLAT (nlist8192)325.0 GB0 GB97.4%14.8 ms¥ 11,200 元 / 月DiskANN 内存/磁盘混合索引48.5 GB (⭐ 暴降 90.9%!)380.0 GB (极度便宜)96.8% (极其优异)8.5 ms (依然保持毫秒级)¥ 2,800 元 / 月 (省 84.8%!)Python SDK 创建与配置 DiskANN 索引实操在 Milvus 中创建 DiskANN 索引极其简洁明了from pymilvus import Collection def build_diskann_hybrid_index(collection: Collection, vector_field_name: str vector): print( [DiskANN 索引构建启动] 正在配置内存-磁盘混合存储架构...) # 核心索引参数配置 index_params { metric_type: IP, # 推荐使用归一化内积 index_type: DISKANN, # 声明为 DiskANN 混合索引 params: { # 搜索时在内存中维护的候选搜索列表大小 (越大精度越高默认 32~64) search_list: 48 } } # 执行索引构建 (Milvus 会自动在数据盘上构建 Vamana 图与 PQ 内存索引) collection.create_index( field_namevector_field_name, index_paramsindex_params ) print(✅ DiskANN 索引构建指令已下发索引将持久化于 NVMe SSD 高速存储中)生产选型与硬件配置三大黄金军规必须挂载真正的 NVMe SSD严禁使用云盘 NAS / NFSDiskANN 在检索阶段依赖每秒数千次的微小随机磁盘读Random 4KB Reads。底层存储必须是物理直连的 NVMe SSD4K 随机读 IOPS $\ge 100,000$如果挂载在网络共享盘NFS/EFS上网络延时会导致查询耗时暴涨到上百毫秒留足操作系统 PageCache 预读内存虽然 DiskANN 仅需 48GB 内存但建议服务器配置 64GB 内存留出 16GB 给 Linux 内核做 NVMe 磁盘块的 PageCache 预读可以让 60% 的热点磁盘 I/O 直接在内存中被命中适用于千万至十亿级的大规模场景对于小于 100 万的小型知识库直接使用 HNSW 内存更省事当数据量突破1000 万以上且对服务器预算极度敏感时DiskANN 是最具工业级 ROI 的首选底座。总结架构演进的魅力在于用巧妙的软件算法克服硬件的成本物理极限。“内存做 PQ 粗筛导航NVMe SSD 承载全量原始图与向量数据异步 I/O 实现微秒级随机点查”DiskANN 以削减 90% 物理内存的惊人优势让企业以极低的硬件代价轻松驾驭十亿级海量高维向量检索。