大家好,我是工藤学编程 🦉 | 一个正在努力学习的小博主,期待你的关注 |
|---|---|
实战代码系列最新文章😉 | C++实现图书管理系统(Qt C++ GUI界面版) |
SpringBoot实战系列🐷 | 【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案 |
分库分表 | 分库分表之实战-sharding-JDBC分库分表执行流程原理剖析 |
消息队列 | 深入浅出 RabbitMQ-RabbitMQ消息确认机制(ACK) |
AI大模型 | 零基础学AI大模型之Milvus向量数据库全解析 |
前情摘要 1、零基础学AI大模型之读懂AI大模型 2、零基础学AI大模型之从0到1调用大模型API 3、零基础学AI大模型之SpringAI 4、零基础学AI大模型之AI大模型常见概念 5、零基础学AI大模型之大模型私有化部署全指南 6、零基础学AI大模型之AI大模型可视化界面 7、零基础学AI大模型之LangChain 8、零基础学AI大模型之LangChain六大核心模块与大模型IO交互链路 9、零基础学AI大模型之Prompt提示词工程 10、零基础学AI大模型之LangChain-PromptTemplate 11、零基础学AI大模型之ChatModel聊天模型与ChatPromptTemplate实战 12、零基础学AI大模型之LangChain链 13、零基础学AI大模型之Stream流式输出实战 14、零基础学AI大模型之LangChain Output Parser 15、零基础学AI大模型之解析器PydanticOutputParser 16、零基础学AI大模型之大模型的“幻觉” 17、零基础学AI大模型之RAG技术 18、零基础学AI大模型之RAG系统链路解析与Document Loaders多案例实战 19、零基础学AI大模型之LangChain PyPDFLoader实战与PDF图片提取全解析 20、零基础学AI大模型之LangChain WebBaseLoader与Docx2txtLoader实战 21、零基础学AI大模型之RAG系统链路构建:文档切割转换全解析 22、零基础学AI大模型之LangChain 文本分割器实战:CharacterTextSplitter 与 RecursiveCharacterTextSplitter 全解析 23、零基础学AI大模型之Embedding与LLM大模型对比全解析 24、零基础学AI大模型之LangChain Embedding框架全解析 25、零基础学AI大模型之嵌入模型性能优化 26、零基础学AI大模型之向量数据库介绍与技术选型思考 27、零基础学AI大模型之Milvus向量数据库全解析
上一篇我们全面拆解了Milvus向量数据库的基础特性、架构和核心概念,知道了Collection、Entity这些“数据容器”的作用。但面对亿级甚至千亿级向量数据,Milvus是如何高效组织和检索的?核心就在于“分区-分⽚-段”这三层数据结构——这也是很多同学最容易混淆的点。今天就用“图书馆管理”的通俗比喻,带你吃透三者的关系、作用,再送上可直接落地的最佳实践!

Milvus的核心优势是“海量数据下的高性能检索”,而这三层结构正是实现这一优势的关键:
简单说,这三层结构就像图书馆的“分层管理体系”,让海量数据变得“井井有条”,查询和写入效率翻倍。
把Milvus的Collection(集合)类比成一个超大型图书馆,里面存放着上亿本“数据图书”。为了管好这些书,图书馆设计了三层管理逻辑,对应Milvus的三层结构:

维度 | 分区(Partition) | 分⽚(Shard) | 段(Segment) |
|---|---|---|---|
层级关系 | Collection下的逻辑划分 | Partition下的物理分布 | Shard下的最小存储单元 |
管理方式 | 用户手动创建、指定 | 系统自动分配、路由 | 系统完全自动管理 |
核心目的 | 业务隔离,减少查询范围 | 负载均衡,提升并行能力 | 存储优化,加速读写 |
可见性 | 对用户可见(可指定查询) | 对用户透明(无需关注) | 对用户完全透明 |
类比对象 | 图书馆的“楼层主题区” | 楼层内的“平行书架” | 书架上的“可拆卸书盒” |

以“电商平台上传10万条商品向量数据”为例,看分区-分片-段的协作过程:
这部分是核心干货,直接告诉你怎么用、怎么避坑,新手也能快速上手!
from pymilvus import Collection
# 假设已创建Collection:products
collection = Collection(name="products")
# 1. 创建按类别划分的分区
collection.create_partition(partition_name="category_electronics")
collection.create_partition(partition_name="category_clothing")
collection.create_partition(partition_name="category_food")
# 2. 创建按时间划分的分区
collection.create_partition(partition_name="time_202401")
collection.create_partition(partition_name="time_202402")
# 3. 查询时指定分区(只查2024年1月的电器数据)
query_params = {
"data": [query_vector],
"partition_names": ["category_electronics", "time_202401"],
"limit": 10
}
results = collection.search(**query_params)from pymilvus import FieldSchema, CollectionSchema, DataType, Collection
# 定义字段(同前文)
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, dim=768),
FieldSchema(name="category", dtype=DataType.VARCHAR, max_length=50),
FieldSchema(name="price", dtype=DataType.FLOAT)
]
schema = CollectionSchema(fields, description="商品向量库")
# 创建集合时指定分⽚数(64个分⽚,适配8台8核机器)
collection = Collection(
name="products",
schema=schema,
shards_num=64 # 核心配置:分⽚数
)from pymilvus import Collection, connections
connections.connect("default", host="localhost", port="19530")
collection = Collection(name="products")
# 1. 调整段大小阈值(通过Milvus客户端配置)
# 方式1:创建集合时通过schema配置(部分版本支持)
schema = CollectionSchema(
fields=fields,
description="商品向量库",
properties={"storage.segmentSize": 1024} # 段大小1GB(单位MB)
)
# 方式2:通过客户端设置全局属性
client = connections.get_connection_client("default")
client.set_property("dataCoord.segment.maxSize", "1024") # 最大段大小1GB
client.set_property("dataCoord.segment.sealProportion", "0.7") # 写入70%时密封
# 2. 查看段信息
segment_info = collection.get_segment_info()
print("当前段数量:", len(segment_info))
# 3. 手动触发段合并(数据写入后执行)
collection.compact()
print("段合并触发成功,后台异步执行")这三层结构是Milvus高性能的基石,掌握后就能灵活应对不同规模的业务场景——从几十万向量的小项目,到千亿向量的企业级系统,都能通过合理配置发挥Milvus的最大性能。