向量数据库Milvus数据处理
一、向量数据库Milvus数据结构
Milvus的数据结构主要分为:逻辑模型、物理模型、段结构与索引;核心是:Collection - > Shard -> Partition ->Segment - >Field/Entity
1. 逻辑数据模型
1). Collection(集合):
- 关系数据库Table类似,是数据的顶级容器
- 包含:Scheme(字段定义)、Shards、Partition、Segment
- 必含:Schema+1个主键+>=1个向量字段
- 支持Array of Structs(结构图数组)、Geo类型、带时区(TimesStamp)

a. Schema(模式)
主要是定义Collection的字段结构,必须包括:
- 主键字段(Primary Key):唯一标识实体、支持int64/ varchar
- 至少一个向量字段:如FLOAT_VECTOR(稠密)、SPARSE_VECTOR(稀疏)
- 标量字段(Scalar Fields):Int64、Float、Bool、Varchar、JSON等
- Array of Structs(2.6.4+支持):一个字段内嵌多个子字段(向量+标量),支持ColBERT、多模态、文档分块存储
支持的向量数据类型:
|
数据类型 |
描述 |
典型应用场景 |
|
|
标准的 32 位浮点数向量,最常用 。 |
大多数通用向量模型,如 OpenAI、BERT、ResNet 等。 |
|
|
由 0 和 1 组成的向量 。 |
需要特定哈希算法的场景,如图像检索中的局部敏感哈希(LSH)。 |
|
|
16 位半精度浮点数向量 。 |
深度学习或 GPU 计算,以降低内存和带宽占用。 |
|
|
16 位浮点数,精度降低但指数范围与 Float32 相同 。 |
深度学习场景,可在不明显影响精度的情况下减少内存使用。 |
|
|
用于表示稀疏向量,仅存储非零值及其索引 。 |
自然语言处理中的词袋模型、推荐系统中的大规模ID特征等。 |
主要的数据类型以及用途:
|
数据类型 |
描述 |
典型应用场景 |
|
INT64 |
64 位有符号整数 |
用户 ID、商品 ID、数量、年龄等数值型 ID 或计数。 |
|
VARCHAR |
可变长度字符串(需指定 ) |
文件名、类别、描述文本、UUID 等文本信息。 |
|
BOOL |
布尔值 |
是否已删除、是否付费、是否上架等状态标识。 |
|
FLOAT / DOUBLE |
单/双精度浮点数 |
价格、评分、温度、地理坐标等连续数值。 |
|
JSON |
灵活的 JSON 对象 |
存储动态属性、嵌套结构、多样化的元数据(如产品规格、用户画像)。 |
|
ARRAY |
同类型元素的数组(Milvus 2.4+) |
标签列表、多个分类 ID、特征组合等。 |
b. Entity(实体):
- 类似关系数据库Row,是一条完整的记录
- 由多个字段值组成:1主键+1个向量+0~N个标量+(可选)Struct数组
- Array of Structs示例
{
"id": 1,
"title": "Milvus 2.6",
"chunks": [
{"text": "...", "vec": [0.1,0.2,...]},
{"text": "...", "vec": [0.3,0.4,...]}
]
}

c. Shard(分片)
- 水平拆分单元。提升写入吞吐
- 默认按照主键Hash分片,一个Shard对应一个vchannel(虚拟通道)
- StreamNode重构、新队列Woodpecker,吞吐更高

d. Partition(分区)
- 逻辑分组,提升查询过滤效率
- 按照业务维度划分(如日期、用户类型),查询时可指定分区减少扫描范围

2. 物理存储结构(Tiered Storage + StorageV2)
a. 存储分层
- 元数据(etcd):Collection、Schema、Segment元信息
- WAL(Woodpecker、Kafka):写入日志,持久化与恢复
- 对象存储(MinIO、S3):Sealed Segment、Parquet+Vortex双格式、省内存
- 热/冷分层:热数据---内存/SSD,高频访问;冷数据 ---- 对象存储,按需加载,节省成本(80%)
b. Segment(数据段)
- Milvus 调度与存储的最小单位,不可分拆
- Growing Segment(增长段):接收实时写入,可变,内存+WAL;数据量达到阈值(默认128MB)后转为Sealed
- Sealed Segment(封存段):不可变、持久化到对象存储(MinIO、S3);构建索引,供查询节点加载
- L0 Segment :仅存Delta Logs(删除日志),记录主键+时间戳,支持逻辑删除

c. Segment内部结构(列式存储)
Segment包含:
- 数据文件(Data Chunks):按字段列式存储、向量与标量分离(Parquet+Vortex)
- 索引文件(Index Files):向量索引(如HNSW、IVF_FLAT)+标量索引(倒排/Path Index)
- 元数据(Metadata):主键、时间戳、删除标记、分层冷热标记等
d. 存储分层
- 元数据(Meta Storage):etcd存储Collection元信息、Schema、索引状态
- WAL日志:Kafka/Pulsar存储写日志、保证数据可靠与恢复
- 对象存储(Object Storage):MinIO/S3 存储Sealed Segment 的数据与索引文件
3. 向量索引结构
Milvus默认使用HNSW向量索引;虽然种类繁多,但是主要以如下三个核心组件构成,协同工作以实现速度和精度的平衡;
|
组件 |
作用 |
通俗解释 |
|
数据结构 |
将海量向量划分为多个组或构建图关系,用于粗筛候选向量 |
像图书馆的分区(文学区、科技区),先确定大致范围,而不是满屋乱找 |
|
量化 (可选) |
压缩向量数据,降低内存占用,加速计算 |
像给一本大部头书做摘要,阅读摘要比读全文快得多 |
|
精炼 (可选) |
对粗筛出的候选结果,用原始高精度向量重新排序,提升召回率 |
读了摘要觉得相关后,再去书架找原书精读确认 |
HNSW:
- 多层有向图:Layer 0 : 全量向量、精确连接;Layer 1~n:稀疏节点、高层捷径加速
- 每个节点:向量ID、向量数据、各层邻居列表
- RaBitQ 1-bit量化、内存降低72%,查询快4x
标量索引:
- Path Index(JSON字段):JSON过滤快100X
- BM25全文索引:多语言分析器、比ES快4x
a. 常见索引类型:
|
索引类型 |
数据结构 |
量化方式 |
特点 |
适用场景 |
|
FLAT |
暴力搜索 |
无 |
精确检索,召回率100%,但数据量大时速度极慢 |
数据集规模小(如百万级以内),对精度要求极高,数据量不大 |
|
IVF_FLAT |
IVF(倒排) |
无 |
速度和精度平衡,查询速度快,内存占用相对合理 |
一般大规模向量检索场景,追求高召回率和可接受的查询延迟 |
|
IVF_SQ8 |
IVF(倒排) |
标量量化(SQ) |
内存占用低(可节省75%),查询速度快,精度略有损失 |
内存资源有限的环境,可接受轻微精度损失以换取高吞吐量 |
|
IVF_PQ |
IVF(倒排) |
乘积量化(PQ) |
压缩率极高,内存占用极低,精度有一定损失 |
内存极度受限的大规模数据集场景,或进行分布式检索 |
|
HNSW |
图 |
无 |
查询速度极快,精度高,但构建慢且内存消耗巨大 |
对延迟要求极高、数据量能放进内存的场景,如高实时性要求的在线服务 |
|
DiskANN |
基于图的磁盘索引 |
有 |
突破内存限制,利用SSD存储索引,成本低且性能不错 |
单机数据量远超内存(如十亿级以上)的场景,需要成本效益高的方案 |
补充:(1)对于二进制向量,应使用BIN_FLAT或BIN_IVF_FLAT索引
(2)对于稀疏向量,应使用SPARSE_INVERTED_INDEX 索引
b. 索引决策单:
1. 数据量与内存的关系
- 所有向量数据都能放入内存:追求极致速度选 HNSW;追求性价比选 IVF_FLAT。
- 数据量远大于可用内存:首选 DiskANN,也可以使用
IVF_PQ配合 mmap 技术。
2. 性能要求 (延迟 vs. 吞吐)
- 要求极低延迟 (高QPS):HNSW 或 IVF_SQ8 是不错的选择。
- 查询的Top-K值非常大 (如 > 2000):IVF 系列索引通常优于基于图的索引。
3. 精度要求
- 需要100%精确召回:唯一选择是 FLAT。
- 接受非常高的近似召回 (>99%):HNSW 和 IVF_FLAT 通常表现最佳。
- 内存受限,可接受轻微精度损失:选择 IVF_SQ8 或 IVF_PQ。
4. 查询的标量过滤比例
- 过滤比例 < 85%:HNSW 表现更好。
- 过滤比例在 85% - 95%:IVF 系列索引更优。
- 过滤比例 > 98%:FLAT 反而可能更快。
4. 关键技术
1. 热冷分层存储(Tiered Storage)
- 自动识别冷热数据
- 冷数据首次访问按需加载,之后缓存
- 相同硬件容量提升 4.3 倍,成本降 80%
2. Delta Logs 与 L0 Segment
- 删除不立即清理,写入 Delta Logs(L0)
- 查询时过滤已删除主键
- Compaction 时合并删除记录,提升性能
3. StreamNode 重构
- 新队列 Woodpecker
- 流式写入吞吐提升,实时 / 离线处理统一

浙公网安备 33010602011771号