向量以专门的数据结构和存储格式存储在数据库中,这些结构和格式针对高维数值数据进行了优化。在大多数情况下,向量(表示为浮点数或整数的数组)存储在专门的列或字段中,这些列或字段旨在处理大型数值序列。 例如,PostgreSQL 的 vector
扩展引入了 vector
列类型,该类型直接存储诸如 [0.25, -0.12, 0.98]
之类的数组。 诸如 MongoDB 之类的 NoSQL 数据库使用 BSON(二进制 JSON)格式将向量数组序列化到文档中。 这些存储方法优先考虑高效的序列化和反序列化,以最大程度地减少读/写操作期间的开销。
为了实现快速相似性搜索(例如,查找最接近查询的向量),数据库使用针对向量数据量身定制的索引技术。常见的方法包括分层可导航小世界 (HNSW)、倒排文件 (IVF) 索引或基于树的结构(如 KD 树)。 例如,向量数据库 Milvus 使用 HNSW 创建类似图的层,这些层允许以亚线性时间复杂度进行近似最近邻 (ANN) 搜索。索引通常在数据插入期间构建并与原始向量分开存储,以优化搜索性能。一些系统还将数据分区为分片或集群(例如,在 IVF 中使用 k-means)以缩小搜索范围,从而减少计算开销。
诸如量化和压缩之类的优化进一步提高了存储效率。量化降低了向量精度(例如,将 32 位浮点数转换为 8 位整数),以节省空间并加速计算。例如,Facebook 的 FAISS 库使用乘积量化将向量拆分为子向量并使用代码本压缩它们。数据库还可以对大型数据集采用内存映射文件或 GPU 加速存储。实际的实现通常结合使用这些技术:数据库可能会以压缩的二进制格式存储原始向量,在内存中维护 HNSW 索引,并使用量化进行磁盘存储。这种分层方法平衡了速度、准确性和资源使用,从而实现了可扩展的向量管理。