主题
Milvus 向量数据库教程大纲
当向量搜索需要"大"和"快"——Milvus,为十亿级向量而生的分布式检索引擎
📖 教程概述
如果你已经学过本系列的 Chroma 和 pgvector 教程,你可能会问:Chroma 够简单、pgvector 够实用,为什么还要学 Milvus?答案就一个字——大。Chroma 适合百万级向量的快速原型,pgvector 适合千万级向量的混合查询,但当你的数据量达到亿级甚至十亿级——全网商品搜索、跨模态检索、推荐系统的用户-物品向量——单机方案就力不从心了。Milvus 是目前最成熟的开源分布式向量数据库,它原生支持分片(Sharding)、多副本(Replication)、向量量化(Quantization),以及从 IVFFlat 到 DiskANN 的多种索引类型,让你在海量数据面前依然能保持毫秒级的检索延迟。
但 Milvus 的"大"也带来了"复杂"——分布式架构、多种部署模式、丰富的索引参数、数据一致性模型……这些概念对初学者来说并不友好。本教程的目标就是帮你把 Milvus 的复杂性拆解成可理解、可操作的知识块——从最简单的 Milvus Lite(一个 Python 包就能跑)到生产级的分布式集群,从最基本的向量搜索到高级的多向量检索和重排序,从 CRUD 到分区管理和多租户隔离。我们不只讲 API 怎么调,更要理解 Milvus 的架构设计、索引选型的权衡、以及它在 RAG 架构中与 Chroma/pgvector 的互补关系。
本教程共 7 章:第 1~2 章带你理解 Milvus 的架构和核心概念,第 3~4 章深入数据操作和索引调优,第 5 章探索高级特性,第 6 章实战 RAG 系统,第 7 章覆盖生产部署与运维。如果你已经学过 Chroma 或 pgvector 教程,很多概念(向量、距离度量、ANN 索引)你已经熟悉了,本教程会侧重 Milvus 的独特之处——分布式架构、量化索引、分区管理、多向量搜索。
🗺️ 章节规划
第1章:Milvus 概述与架构
1.1 Milvus 是什么?为什么需要分布式向量数据库
- 从单机到分布式的必然:当向量数量从百万到十亿,单机的内存和算力都不够用——你需要把数据分片到多台机器上,并行计算距离,合并结果
- Milvus 的定位:云原生分布式向量数据库,专为大规模、高吞吐、低延迟的向量检索场景设计
- Milvus vs pgvector vs Chroma:
- Milvus:分布式、亿级向量、多种索引+量化、运维复杂
- pgvector:单机、千万级、SQL 原生、事务一致性、运维简单
- Chroma:嵌入式、百万级、零配置、Python 原生、适合原型
- Milvus 的核心能力:分布式存储与计算、多种索引类型(FLAT/IVFFlat/HNSW/IVF_PQ/SCANN/DiskANN)、向量量化(PQ/SQ/BQ)、标量过滤、动态字段、多向量搜索
- 谁在用 Milvus:NVIDIA、Roblox、Shopee、京东、搜狐——搜索推荐、图片去重、化学分子检索等场景
1.2 Milvus 架构解析:存算分离的云原生设计
- 存算分离(Disaggregated Storage):为什么 Milvus 把存储和计算分开——独立扩缩容、故障隔离、资源利用率
- 三大核心组件:
- 协调器(Coordinator):大脑——RootCoord(元数据)、QueryCoord(查询调度)、DataCoord(数据调度)、IndexCoord(索引调度)
- 工作节点(Worker Node):手脚——QueryNode(执行搜索)、DataNode(写入数据)、IndexNode(构建索引)
- 存储层(Storage):记忆——元数据存储(etcd)、消息队列(Pulsar/Kafka)、对象存储(MinIO/S3)
- 数据流:写入 → 消息队列 → DataNode → 对象存储 → IndexNode 构建索引 → QueryNode 加载索引 → 搜索
- 为什么需要理解架构:调优和排障时你需要知道瓶颈在哪个组件——是 QueryNode 内存不够?还是对象存储 I/O 太慢?还是 IndexNode 构建索引太慢?
1.3 安装与连接:从 Milvus Lite 到分布式集群
- 三种部署模式:
- Milvus Lite:
pip install pymilvus,纯 Python 本地运行,适合开发和测试 - Milvus Standalone:Docker 单容器,包含所有组件,适合中小规模生产
- Milvus Cluster:Docker Compose / Helm / Operator,多节点分布式,适合大规模生产
- Milvus Lite:
- Milvus Lite 快速体验:python
from pymilvus import MilvusClient client = MilvusClient("./milvus_demo.db") # 本地文件,零配置 - Docker Standalone 一键启动:
docker compose up -d - Zilliz Cloud:Milvus 的全托管云服务,免运维,按量付费
- 连接参数:uri(地址)、token(认证)、db_name(数据库名)
第2章:Milvus 核心概念与数据模型
2.1 Collection 与 Schema:Milvus 的数据模型设计
- Collection:Milvus 的"表",逻辑上的一组同类向量数据
- Schema:Collection 的结构定义——包含哪些字段、每个字段的类型和约束
- FieldSchema:字段定义——名称、类型、是否主键、是否自增、维度(向量字段)
- CollectionSchema:Schema 定义——字段列表、描述、是否启用动态字段
- Schema 设计原则:向量字段必须有、主键字段必须有、标量字段按需添加(影响存储和过滤性能)
- 与 pgvector 的对比:pgvector 用 SQL CREATE TABLE 定义表结构,Milvus 用 Python API 定义 Schema——本质相同,表达方式不同
2.2 字段类型全景:向量字段、标量字段、动态字段
- 向量字段:
DataType.FLOAT_VECTOR(float32)、DataType.BINARY_VECTOR(二值)、DataType.FLOAT16_VECTOR、DataType.BFLOAT16_VECTOR、DataType.SPARSE_FLOAT_VECTOR(稀疏向量)- 维度参数
dim:向量维度,如 768、1536 - 一个 Collection 可以有多个向量字段(多模态场景:文本向量 + 图像向量)
- 维度参数
- 标量字段:
DataType.INT64、DataType.INT32、DataType.VARCHAR、DataType.BOOL、DataType.JSON、DataType.ARRAY- 标量字段用于过滤(WHERE 条件),不参与相似度计算
- VARCHAR 需要指定
max_length,JSON 类型用于灵活的 metadata
- 主键字段:
is_primary=True,支持 INT64 自增和 VARCHAR 自定义 - 动态字段:
enable_dynamic_field=True,允许插入 Schema 之外的字段,自动存入$metaJSON 字段- 什么时候用动态字段:metadata 字段不确定、不同文档有不同的属性
- 动态字段的代价:过滤性能不如静态标量字段、不支持索引(2.4.x 版本开始支持 JSON 索引)
2.3 距离度量:L2 / Cosine / IP
- 三种距离度量的数学定义和直觉解释:
- L2(欧氏距离):空间中两点的直线距离,值越小越相似
- Cosine(余弦相似度):向量方向的夹角,忽略长度差异,适合文本语义
- IP(内积):向量点积,值越大越相似,适合已归一化的向量
- 距离度量在 Collection 级别指定:创建 Collection 时选定,之后不可更改
- 距离度量的选择指南:
- 文本语义搜索 → Cosine(文本 embedding 通常关注方向而非长度)
- 图像特征匹配 → L2 或 IP(取决于模型输出是否归一化)
- 推荐系统 → IP(用户向量和物品向量的内积表示偏好强度)
- 与 pgvector 的对比:pgvector 在查询时选择操作符(
<->/<=>/<#>),Milvus 在建表时指定度量——Milvus 的设计更严格,避免了操作符不匹配导致索引失效的问题
第3章:数据操作——CRUD 与搜索
3.1 数据插入:单条、批量与 Partition
- insert():插入数据,传入字段字典或字典列表
- 批量插入的性能优化:
- 单次插入建议 1000~10000 条
- 超大批量使用分批插入 + 动态调整批次大小
- 插入后需要
flush()确保数据持久化(Milvus Lite 自动 flush)
- Partition:Collection 的物理分区,数据按分区键自动路由
- 为什么用 Partition:按时间/分类分区,搜索时只扫描相关分区,减少计算量
- 创建分区:
create_partition()/ 自动分区(Partition Key) - 常见误区:分区数不是越多越好——每个分区都有管理开销,建议 64~512 个
3.2 向量搜索:search() 详解
- search() 的完整参数:
data:查询向量列表(支持批量搜索)anns_field:搜索的向量字段名param:索引参数(如{"metric_type": "COSINE", "params": {"ef": 100}})limit:返回结果数(Top-K)expr:标量过滤表达式output_fields:返回哪些字段consistency_level:一致性级别
- 搜索结果解析:距离值、ID、返回字段
- 批量搜索:一次传入多个查询向量,返回每个查询的 Top-K 结果
- 搜索参数与索引类型的对应:不同索引类型有不同的搜索参数(HNSW 的 ef、IVFFlat 的 nprobe、IVF_PQ 的 nprobe)
3.3 标量过滤:expr 表达式与混合查询
- 过滤表达式语法:
- 比较:
category == "tech"、price < 1000、year >= 2024 - 逻辑:
and、or、not - 集合:
category in ["tech", "science"] - JSON 路径:
metadata["author"] == "Alice"、metadata["tags"] contains "AI" - 数组:
array_contains(tags, "AI")、array_length(tags) > 2
- 比较:
- 过滤的执行策略:
- Milvus 2.x:先过滤再搜索(Filter-then-Search)——先根据标量条件缩小候选集,再在候选集中做向量搜索
- Milvus 2.5+:支持迭代过滤(Iterative Filter)——搜索和过滤交替进行,提升高选择性过滤的性能
- 过滤性能优化:为高频过滤字段建标量索引(B-tree / Marisa-trie / INVERTED)
- 与 pgvector 混合查询的对比:pgvector 的 WHERE + ORDER BY 在一条 SQL 中完成,Milvus 的 expr 参数在 search() 中指定——功能等价,表达方式不同
3.4 数据查询、更新与删除
- query():按标量条件查询,不涉及向量搜索——
query(expr="category == 'tech'", output_fields=["content", "category"]) - get():按主键精确获取——
get(ids=[1, 2, 3]) - upsert():存在则更新,不存在则插入——基于主键判断
- delete():按主键删除或按表达式批量删除
- 删除是逻辑删除(标记为已删除),后台 Compaction 时物理清理
- 删除后空间不会立即释放——需要
compact()+get_compaction_state()
- 常见误区:频繁小批量 upsert 导致 Segment 碎片化——建议攒够一批再写入,或使用 Auto-Compaction
第4章:索引与性能优化
4.1 索引类型全景:从暴力搜索到磁盘索引
为什么 Milvus 有这么多索引类型:不同数据量、不同内存预算、不同精度要求的最优选择不同
索引类型全景图:
索引类型 内存占用 构建速度 查询速度 召回率 适用场景 FLAT 大 无需构建 慢(暴力) 100% 小数据量、基准测试 IVFFlat 中 快 快 中~高 通用场景 HNSW 很大 慢 很快 高 内存充足、低延迟要求 IVF_PQ 小 中 快 中 内存有限、大数据量 IVF_SQ8 小 快 快 中 内存有限、精度可接受损失 SCANN 中 中 快 高 Google 推荐的 ANN 算法 DiskANN 磁盘为主 慢 中 高 数据量极大、内存有限 GPU_IVF_PQ 小 快 极快 中 GPU 服务器、极致吞吐 索引创建流程:
create_index()→load()→search()- create_index:触发 IndexNode 构建索引
- load:将索引加载到 QueryNode 内存
- ⚠️ 不 load 就不能搜索!这是初学者最常犯的错误
4.2 HNSW 索引详解
- HNSW 原理回顾:多层图结构、O(log N) 搜索、全内存驻留(与 pgvector 的 HNSW 原理相同)
- Milvus HNSW 参数:
M:每层最大连接数(默认 16,推荐 16~64)efConstruction:建索引时的搜索宽度(默认 256,推荐 64~512)ef(搜索参数):查询时的搜索宽度(默认 64,推荐 40~512)
- Milvus HNSW vs pgvector HNSW:
- 参数名不同(M vs m,efConstruction vs ef_construction,ef vs ef_search)
- Milvus 默认值更激进(efConstruction=256 vs pgvector 的 64)
- Milvus 支持增量更新,pgvector 也支持
- HNSW 的内存估算:每条向量约
dim × 4 + M × 2 × 8字节
4.3 量化索引:PQ / SQ / BQ——用精度换内存
- 为什么需要量化:10 亿条 768 维 float32 向量 ≈ 2.9TB 原始数据,HNSW 索引约 6~9TB——没有多少服务器能装下。量化把 float32 压缩成更小的表示,内存减少 4~32 倍
- PQ(Product Quantization)原理:
- 把 768 维向量切成 48 个 16 维子空间
- 每个子空间用 K-Means 聚类出 256 个中心点(1 字节编码)
- 原始向量 → 48 字节编码,压缩比 768×4/48 = 64 倍
- 距离计算用查表代替逐维计算,速度更快
- SQ8(Scalar Quantization)原理:
- 把每个 float32 压缩成 int8(1 字节)
- 压缩比 4 倍,精度损失比 PQ 小
- 实现简单,适合对精度要求稍高的场景
- BQ(Binary Quantization)原理:
- 把每个 float32 压缩成 1 bit(0 或 1)
- 压缩比 32 倍,精度损失最大
- 适合超大规模初筛,再用高精度索引重排
- 量化索引的选择:内存预算 → 数据量 → 精度要求 → 选择 PQ/SQ/BQ
- pgvector 不支持量化——这是 Milvus 在大规模场景下的核心优势
4.4 索引选型与参数调优实战
- 索引选型决策树:
数据量有多大? ├─ < 10 万 → FLAT(暴力搜索足够快) ├─ 10 万 ~ 1000 万 │ ├─ 内存充足?→ HNSW(最快、最高召回率) │ └─ 内存有限?→ IVF_SQ8 或 IVF_PQ ├─ 1000 万 ~ 1 亿 │ ├─ 内存充足?→ HNSW 或 SCANN │ └─ 内存有限?→ IVF_PQ 或 DiskANN └─ > 1 亿 ├─ 内存充足?→ HNSW + 分片 └─ 内存有限?→ DiskANN 或 IVF_PQ + 分片 - 索引参数调优方法论:
- 先用默认参数建立基线
- 用
recall@K指标评估召回率 - 调整搜索参数(ef/nprobe)在速度和精度之间找平衡
- 只有在召回率不达标时才调整构建参数(M/efConstruction/nlist)
- 标量索引:为高频过滤字段创建标量索引
INVERTED:倒排索引,适合等值和范围查询(Milvus 2.5+ 推荐)STL_SORT:排序索引,适合范围查询MARISA-TRIE:前缀索引,适合字符串前缀匹配
- 常见误区:建了索引但忘记
load()——Milvus 的索引需要显式加载到 QueryNode 内存才能用于搜索
第5章:高级特性
5.1 Partition 分区管理
- Partition 的作用:把 Collection 按某个维度(时间、分类、租户)物理切分,搜索时只扫描相关分区
- 手动分区:
create_partition("partition_name")→ 插入时指定partition_name - Partition Key(自动分区):建表时指定某个字段为 Partition Key,Milvus 根据字段值自动路由到对应分区python
FieldSchema("category", DataType.VARCHAR, max_length=64, is_partition_key=True) - 分区数量建议:每个 Collection 建议 64~512 个分区,太多会增加协调器负担
- 分区与多租户:每个租户一个分区,搜索时只查自己的分区——天然的数据隔离
- 常见误区:把 Partition 当成索引——分区减少的是扫描范围,不是距离计算加速
5.2 多向量搜索与重排序
- 多向量字段:一个 Collection 可以有多个向量字段——比如文本 embedding 和图像 embedding
- 多向量搜索(Hybrid Search):
- 同时搜索多个向量字段,合并结果
WeightedRanker:按权重加权合并距离RRFRanker:Reciprocal Rank Fusion,按排名倒数合并——更鲁棒,不需要调权重
- 重排序(Reranking):先用 ANN 索引快速召回候选集,再用精确距离或交叉编码器重排
- Milvus 内置的
rerank参数:搜索时返回更多候选,按精确距离重排
- Milvus 内置的
- 应用场景:多模态搜索(文本搜图)、多语言搜索(不同语言的 embedding 模型)、搜索+推荐融合
5.3 动态字段与 JSON 过滤
- 动态字段的工作原理:插入时传入 Schema 之外的字段,自动存入
$meta字段(JSON 格式) - JSON 过滤表达式:
metadata["source"] == "wiki"、metadata["tags"] contains "AI" - JSON 索引(Milvus 2.5+):为 JSON 字段创建索引加速过滤python
index_params.add_index(field_name="metadata", index_type="INVERTED", index_name="idx_meta") - 动态字段 vs 静态标量字段:
- 静态字段:过滤快(有独立索引)、类型严格、Schema 固定
- 动态字段:灵活(无需预定义)、过滤稍慢、适合 metadata 不确定的场景
- 常见误区:把所有字段都设成动态字段——过滤性能会显著下降,高频过滤字段应该定义为静态标量字段
5.4 数据一致性与持久化
- 一致性级别(Consistency Level):
- Strong:搜索前强制同步所有写入——最慢但最新
- Bounded:允许一定延迟(默认 180s)——平衡速度和新鲜度
- Session:同一客户端写入后立即可见——适合单客户端场景
- Eventually:最终一致,不保证可见性——最快但可能读到旧数据
- 为什么 Milvus 需要一致性级别:分布式系统中,数据写入后需要时间同步到查询节点——你刚插入的数据可能"暂时搜不到"
- Flush 与 Compaction:
flush():强制将缓冲区数据写入持久化存储compact():合并小 Segment、清理已删除数据、优化存储空间
- 常见误区:插入后立即搜索发现数据"丢了"——其实是数据还在缓冲区,需要 flush 或等待自动同步
第6章:Milvus 在 RAG 系统中的实战
6.1 RAG 架构中 Milvus 的定位
- Milvus vs pgvector vs Chroma 在 RAG 中的定位差异:
- Chroma:快速原型、小规模验证
- pgvector:中等规模、需要 SQL 和事务
- Milvus:大规模生产、需要分布式和量化
- Milvus 的独特优势:
- 分布式架构 → 水平扩展,数据量无上限
- 量化索引 → 同等内存下存储更多向量
- Partition → 多租户天然隔离
- 多向量搜索 → 多模态 RAG
- Milvus 的劣势:
- 无 SQL → 不能做 JOIN、子查询、窗口函数
- 无事务 → 不能保证跨表一致性
- 运维复杂 → 需要管理多个组件
- RAG 全链路中 Milvus 覆盖的环节:向量存储 + 向量索引 + 标量过滤 + 多向量检索
6.2 端到端 RAG Demo:大规模文档问答系统
- 项目结构:数据加载 → 切分 → embedding → 入库 Milvus → 混合检索 → 重排序 → 生成
- Collection 设计:python
fields = [ FieldSchema("id", DataType.INT64, is_primary=True, auto_id=True), FieldSchema("content", DataType.VARCHAR, max_length=65535), FieldSchema("source", DataType.VARCHAR, max_length=256), FieldSchema("category", DataType.VARCHAR, max_length=64, is_partition_key=True), FieldSchema("embedding", DataType.FLOAT_VECTOR, dim=768), FieldSchema("metadata", DataType.JSON), ] - Python 完整实现:
- 文档加载与切分(RecursiveCharacterTextSplitter)
- Embedding 编码(SentenceTransformers / OpenAI API)
- 批量入库(分批 insert + flush)
- 混合搜索(expr 过滤 + 向量搜索)
- RRF 重排序(多路召回合并)
- Prompt 组装与 LLM 调用
- 与 pgvector RAG Demo 的对比:同样的功能,不同的实现方式——pgvector 用 SQL,Milvus 用 Python API
6.3 多租户与权限隔离
- 多租户的三种方案:
- Partition 隔离:每个租户一个 Partition,搜索时指定 Partition——推荐方案
- Collection 隔离:每个租户一个 Collection——管理开销大,适合租户数量少的场景
- 字段过滤:所有租户共享一个 Collection,用
tenant_id == xxx过滤——最简单但性能最差
- Partition Key 多租户:Milvus 2.2.9+ 支持自动分区路由,搜索时自动过滤到对应租户的分区
- RBAC 权限控制(Milvus 2.5+):用户、角色、权限——控制谁能访问哪些 Collection
- 常见误区:用 Collection 隔离租户但租户数量成千上万——每个 Collection 都有元数据开销,协调器会被压垮
第7章:生产部署与运维
7.1 集群部署方案
- Milvus Standalone:Docker 单容器,所有组件打包在一起,适合开发和小规模生产
- Milvus Cluster:Docker Compose / Helm / Milvus Operator,组件独立部署,适合大规模生产
- Docker Compose:最简单的集群部署方式
- Helm + Kubernetes:生产级部署,支持自动扩缩容
- Milv Operator:Kubernetes Operator,声明式管理 Milvus 集群
- Zilliz Cloud:全托管方案,免运维,按量付费,免费层可用
- 依赖组件配置:
- etcd:元数据存储,3 节点集群保证高可用
- MinIO / S3:对象存储,数据持久化
- Pulsar / Kafka:消息队列,写入缓冲和事件驱动
- 资源规划:
- QueryNode:内存 = 索引大小 × 副本数 + 预留
- DataNode:CPU 密集,内存适中
- IndexNode:CPU + 内存密集,索引构建时资源消耗大
7.2 性能监控与调优
- Milvus 监控体系:Prometheus + Grafana(官方提供 Dashboard 模板)
- 关键监控指标:
- 搜索延迟(P50/P95/P99)
- 搜索 QPS
- 写入速率
- QueryNode 内存使用率
- Segment 数量和大小
- Compaction 进度
- 常见性能问题与排查:
- 搜索延迟高 → 检查 QueryNode 内存是否足够、索引参数是否合理
- 写入吞吐低 → 检查消息队列积压、DataNode 数量是否足够
- 索引构建慢 → 检查 IndexNode 资源、数据量是否过大
- 内存持续增长 → 检查是否需要 Compaction、是否有 Segment 碎片化
- 参数调优:
search_channels:搜索并发通道数topk_merge_ratio:多分片搜索结果合并策略segment_max_size:Segment 大小上限(影响 Compaction 策略)
7.3 Milvus 的局限性与替代方案
- 已知局限:
- 无 SQL 支持:不能做 JOIN、子查询、窗口函数——复杂查询需要应用层拼接
- 无事务保证:不支持跨 Collection 的原子操作
- 运维复杂度高:分布式组件多(etcd + MinIO + Pulsar + Milvus),排障门槛高
- 一致性模型较复杂:刚写入的数据可能"搜不到",需要理解一致性级别
- 小规模场景"杀鸡用牛刀":百万级数据用 Milvus 反而比 pgvector 慢(分布式开销)
- 何时该用 Milvus:
- 数据量 > 1000 万向量,且持续增长
- 需要向量量化(PQ/SQ/BQ)节省内存
- 需要多租户隔离
- 需要多向量搜索(多模态)
- 需要水平扩展
- 何时该换:
- 数据量 < 1000 万 → pgvector 或 Chroma(更简单)
- 需要 SQL JOIN 和事务 → pgvector
- 需要多模态内置模型 → Weaviate
- 需要极致的单机性能 → Qdrant
- 混合架构:pgvector 处理结构化数据和中等规模向量搜索,Milvus 处理超大规模纯向量搜索——两者互补而非替代
🎯 学习路径建议
向量数据库新手(2-3天):
第1-2章 → 理解 Milvus 的架构和核心概念
→ 能用 Milvus Lite 创建 Collection、插入数据、执行搜索
RAG 开发者(2-3天):
第3-4章 → 掌握 CRUD、搜索、索引选型
→ 能用 Milvus 搭建完整的 RAG 检索 pipeline
高级开发者(3-5天):
第5-6章 → 掌握分区、多向量搜索、多租户、RAG 实战
→ 能设计生产级的 Milvus 数据模型和检索策略
运维工程师(2-3天):
第7章 → 掌握集群部署、监控、调优
→ 能让 Milvus 集群稳定高效运行📚 与 Chroma / pgvector 教程的对照阅读
如果你已经学过本系列的 Chroma 或 pgvector 教程,以下是三个教程的核心对照:
| 概念 | Chroma | pgvector | Milvus |
|---|---|---|---|
| 数据模型 | Document (id/text/embedding/metadata) | Table Row (id/content/embedding/metadata columns) | Entity (id/vector/scalar fields) |
| 集合/表 | Collection | Table | Collection |
| Schema | 隐式(自动推断) | 显式(SQL CREATE TABLE) | 显式(FieldSchema + CollectionSchema) |
| 距离度量 | 创建时指定(hnsw:space) | 查询时选择操作符(<->/<=>/<#>) | 创建时指定(metric_type) |
| 过滤 | where (Python dict) | WHERE (SQL) | expr (字符串表达式) |
| 索引 | 自动 HNSW | 手动 IVFFlat/HNSW | 手动 FLAT/IVFFlat/HNSW/IVF_PQ/SCANN/DiskANN |
| 向量量化 | ❌ | ❌ | ✅ PQ/SQ/BQ |
| 事务 | 无 | 完整 ACID | 无(最终一致性) |
| 分布式 | ❌ | ❌ | ✅ 原生分片+副本 |
| 多向量搜索 | ❌ | ❌ | ✅ Hybrid Search + Reranker |
| 部署 | 嵌入式 / Docker | Docker / 云托管 RDS | Docker / K8s / Zilliz Cloud |
| 适合规模 | < 10M 向量 | < 100M 向量 | 10M ~ 10B+ 向量 |
| 核心优势 | 零配置、Python 原生 | SQL 原生、事务一致性 | 分布式、量化、多向量 |
| 学习曲线 | 低 | 低(会 SQL 就行) | 中~高 |
本大纲遵循以下写作原则:每节以白板式通俗介绍开场 → 深入原理与面试级知识点 → 配合代码示例("比如下面的程序...")→ 覆盖常见用法与误区 → 结尾总结要点衔接下一节。