向量数据库是如何存储的
向量数据库的存储设计与传统关系型数据库(存储行和列)或文档数据库(存储 JSON)有本质区别。它的核心任务是高效存储高维数学向量,并允许在数百万甚至数十亿个向量中,以毫秒级的速度找到语义最相似的向量。
向量数据库的存储架构通常由三个核心部分组成:数据本身的存储、向量索引的构建、以及物理介质与持久化机制。
1. 数据的存储形式
向量数据库在底层需要同时管理两种数据:
高维向量存储:向量在底层表现为浮点数数组(例如一个 1536 维的 Float32 数组,每个向量占用约 6KB 空间)。为了节省昂贵的内存,数据库通常会采用量化技术(如标量量化 SQ 或乘积量化 PQ),将 32 位浮点数压缩为 8 位甚至二进制,从而将存储体积缩小 4 到 16 倍。
元数据(Metadata)存储:每个向量通常会关联一些业务数据,如原始文本、创建时间、分类标签或用户 ID。这些元数据一般使用传统的键值对(Key-Value)或列式引擎(如 RocksDB)进行存储,以便在向量检索时进行联合过滤(Pre-filtering 或 Post-filtering)。
2. 向量索引的组织方式(存储结构)
由于直接遍历每一个向量(暴力搜索)的计算复杂度高达,向量数据库必须在存储空间中构建特殊的“近似最近邻”(ANN)索引结构。
基于图的索引(如 HNSW):将向量作为节点建图,并通过多层跳表结构连接相近的向量。这种结构检索精度和速度极高,但每个向量节点都需要存储多个邻居节点的指针,导致索引占用的内存空间往往比原始向量数据还要大。
基于聚类的倒排索引(如 IVF):利用 K-Means 算法将高维空间划分为多个聚类,存储时只需记录每个聚类中心以及属于该聚类的向量列表。检索时数据库只需对比最近的几个聚类中心,显著降低了存储和内存开销,但召回率略低于图索引。
局部敏感哈希(LSH):利用特定的哈希函数将空间相邻的向量映射到同一个桶(Bucket)中。这种存储方式将连续的向量空间离散化为哈希码,通过哈希冲突来实现相似度归类。
3. 物理存储与持久化机制
向量检索高度依赖随机访问,因此“如何利用内存和磁盘”是存储设计的关键。
内存与磁盘的协同:热数据和活跃索引通常驻留在内存(RAM)中以保证极低的延迟。对于超出内存容量的超大规模数据集,数据库会利用内存映射文件(mmap)技术,或采用专为固态硬盘优化的磁盘索引结构(如 DiskANN),实现将索引主体放在 SSD 上,仅在内存中缓存热点数据。
预写日志(WAL)与数据持久化:为了防止断电导致内存数据丢失,所有的写入、更新或删除操作会首先顺序写入磁盘上的预写日志(Write-Ahead Log)。只有当 WAL 写入成功后,数据才会被放入内存中的缓冲区,随后再异步构建索引并持久化到磁盘。
分片与段存储(Segments):许多现代向量数据库(如 Milvus、Qdrant)借鉴了 LSM 树的思路,将数据切分为多个不可变的“段(Segment)”。新写入的数据先进入活跃段,当达到一定大小后段会被冻结并固化到磁盘,此时才开始对其构建只读的高效向量索引,后台线程会定期将零碎的小段合并以优化存储效率。