一、.Milvus 的核心概念
Milvus 是一款专门为高性能向量检索任务设计的数据库系统。它的核心概念主要包括:
🌟 1. Collection(集合)
类比关系型数据库中的表(Table),一个 Collection 就是一组结构化向量数据的容器。
-
每个 Collection 都有一套完整的 schema(字段定义)
-
每个 Collection 通常代表一个向量检索的主题,比如 "商品图像库" 或 "文档向量库"
✅ 示例:
python
collection_name = "book_collection"
📌 2. Field(字段)
每个 Collection 由若干个字段构成,字段可以是以下几种类型:
字段类型 | 说明 | 示例 |
---|---|---|
Int64 |
主键字段(必须有一个) | book_id = 123 |
FloatVector |
向量字段(必须有一个) | [0.23, 0.98, ..., 0.67] |
Float , Bool , VarChar |
附加属性字段(可选) | price = 89.9 , title="AI入门" |
✅ 示例:
python
from pymilvus import FieldSchema, DataType
fields = [
FieldSchema(name="book_id", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768),
FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=100)
]
🧠 3. Index(索引)
Milvus 为了提升向量检索性能,需要在向量字段上建立 ANN 索引(近似最近邻)。
常见索引类型:
索引类型 | 场景 | 特点 |
---|---|---|
FLAT |
精确检索 | 最慢,耗内存 |
IVF_FLAT |
倒排列表 + 精确子搜索 | 较快,适中 |
HNSW |
小数据量,图搜索结构 | 快,但内存占用高 |
DISKANN |
海量数据场景 | 支持磁盘索引,适合大规模 |
✅ 示例:
python
from pymilvus import FieldSchema, DataType
fields = [
FieldSchema(name="book_id", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768),
FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=100)
]
📂 4. Partition(分区)
一个 Collection 可以按某个字段的取值进行逻辑上的划分,提高查询效率或做数据隔离。
-
常见用途:按用户、时间、类别进行分区
-
在查询时可以指定分区进行检索,跳过无关数据,加快响应
✅ 示例:
python
collection.create_partition("partition_2025")
collection.load(partition_names=["partition_2025"])
🧩 5. Segment(段)
Milvus 内部的数据物理存储单位(你不需要直接操作它)
-
系统会自动将数据拆分成 Segment,每个 Segment 的大小受限(一般为 512MB)
-
在查询和删除数据时,Milvus 会按 Segment 级别加载或合并
-
与"列式存储"系统中的块(Block)类似
📌 通常你只需了解 Segment 的存在,用于理解性能调优或数据刷新机制(compaction)。
🔄 总结类比表
Milvus 概念 | 类比于传统数据库 | 用途 |
---|---|---|
Collection | Table | 存放同类型的向量数据 |
Field | Column | 描述每条数据的内容 |
Index | 索引 | 提高查询速度 |
Partition | 分区 | 逻辑隔离 / 加速查询 |
Segment | 数据块(隐藏) | 系统自动分片管理 |
二、Partition 与 Index 参数对查询性能的影响
✅ 1. Partition 对性能的影响
Milvus 的 Partition(分区)是对 Collection 逻辑上的划分 ,它能在 查询阶段显著减少检索范围。
✨ 性能优势:
-
过滤加速:查询时如果只检索某个分区,而不是整个 Collection,Milvus 只加载该分区对应的 segment。
-
内存节省:未使用的分区不会被 load 到内存,节省资源。
-
隔离性好:分区适合多租户、用户隔离、按时间切片检索等场景。
✅ 2. Index 参数对性能的影响
Index(索引)决定了 Milvus 在做 ANN 检索时的方式,不同索引适用于不同数据量级与精度需求:
索引类型 | 优点 | 适用场景 | 相关参数 |
---|---|---|---|
FLAT |
精确检索,慢 | 小数据量测试 | 无 |
IVF_FLAT |
平衡速度与精度 | 百万级向量 | nlist |
HNSW |
查询快,适中精度 | 小型系统 | M , efConstruction , ef |
DISKANN |
支持磁盘索引,节省内存 | 十亿级数据场景 | search_list_size , pq_code_budget_mb , etc |
👉 参数意义(以 IVF_FLAT 为例):
-
nlist
: 将所有向量划分成多少个簇(越大精度越高,但索引越大) -
查询时的
nprobe
: 在检索时查询几个簇(越多越精确,但慢)
三、Partition 的详细使用案例
我们以一个图书向量库为例,按图书的语言来划分分区。
📝 场景背景:
你有一本书的标题向量化数据,字段如下:
-
book_id
: Int64 -
embedding
: FloatVector(768维) -
language
: VarChar(语言,如 "Chinese", "English", "French")
你想按语言划分 Partition,以提高查询效率。
🧱 Step 1: 定义 Collection 与分区
python
from pymilvus import CollectionSchema, FieldSchema, DataType, Collection, connections
connections.connect()
# 定义字段
fields = [
FieldSchema(name="book_id", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=768),
FieldSchema(name="language", dtype=DataType.VARCHAR, max_length=20)
]
schema = CollectionSchema(fields=fields, description="Book vector database")
collection = Collection(name="book_collection", schema=schema)
# 创建分区
collection.create_partition("chinese_books")
collection.create_partition("english_books")
🧪 Step 2: 插入数据到对应分区
python
# 插入中文图书数据
collection.insert([
[1, 2], # book_id
[[...], [...]], # embedding 向量
["Chinese", "Chinese"] # language
], partition_name="chinese_books")
# 插入英文图书数据
collection.insert([
[3], [[...]], ["English"]
], partition_name="english_books")
🔍 Step 3: 查询时指定分区,提高效率
python
collection.load(partition_names=["english_books"]) # 只加载英文书分区
search_params = {
"metric_type": "L2",
"params": {"nprobe": 10}
}
results = collection.search(
data=[[...]], # 查询向量
anns_field="embedding",
param=search_params,
limit=5,
output_fields=["book_id", "language"],
partition_names=["english_books"] # 👈 仅检索该分区
)
📌 性能提升点:
-
只加载一个分区的 segment,加载更快,占用内存少;
-
查询范围缩小,ANN 检索速度显著加快;
-
数据隔离,避免误检。