跳到主要内容

向量数据库深入

问题​

向量数据库的核心索引算法有哪些?如何选择适合自己场景的向量数据库?

答案​

一、向量数据库全景​

二、核心索引算法​

1. 暴力搜索(Flat / Brute-Force)​

项目说明
原理逐一计算 query 与所有向量的距离
精度100%(精确搜索)
时间复杂度O(n⋅d)O(n \cdot d)(n=向量数,d=维度)
适用数据量 < 10 万,需要精确结果

2. IVF(Inverted File Index)​

  • 构建:将向量用 K-Means 分成 nlist 个簇
  • 搜索:只在最接近的 nprobe 个簇中搜索
  • 权衡:nprobe 越大 → 精度越高、速度越慢

3. HNSW(Hierarchical Navigable Small World)​

面试重点

HNSW 是目前最主流的向量索引算法,几乎所有向量数据库都支持。

  • 原理:多层图结构,上层节点少(快速定位),下层节点全(精确搜索)
  • 优势:查询速度快(O(log⁡n)O(\log n)),精度高(Recall > 95%)
  • 关键参数:
    • M:每个节点的最大连接数(越大精度越高,内存越大)
    • ef_construction:构建时搜索范围(越大索引越好,构建越慢)
    • ef_search:查询时搜索范围(越大精度越高,查询越慢)

4. PQ(Product Quantization)​

将高维向量切分为子空间,每个子空间独立量化:

x=[x1,...,x8⏟子空间1,x9,...,x16⏟子空间2,...]\mathbf{x} = [\underbrace{x_1,...,x_8}_{\text{子空间1}}, \underbrace{x_9,...,x_{16}}_{\text{子空间2}}, ...]
  • 压缩比:128 维 float32 (512B) → 16 个 codebook (16B),压缩 32x
  • 常见组合:IVF + PQ = IVFPQ(先粗筛后量化搜索)

三、索引算法对比​

算法精度速度内存构建时间适用数据量
Flat100%慢高无< 10 万
IVF高快中快10 万 ~ 1000 万
HNSW很高很快高慢100 万 ~ 1 亿
PQ中快低快> 1 亿
HNSW+PQ高很快中慢> 1 亿

四、主流向量数据库对比​

数据库开源托管索引算法过滤特点
Pinecone❌✅自研✅全托管,开箱即用
Milvus✅✅HNSW/IVF/PQ✅功能最全,适合大规模
Qdrant✅✅HNSW✅Rust 编写,性能好
Weaviate✅✅HNSW✅GraphQL API
pgvector✅—HNSW/IVFFlat✅PostgreSQL 扩展
Chroma✅—HNSW✅轻量,适合原型
FAISS✅—全部❌搜索库,非数据库

五、选型决策​


常见面试问题​

Q1: HNSW 为什么比暴力搜索快?​

答案:

  • 暴力搜索需要计算 query 与所有 N 个向量的距离:O(N)O(N)
  • HNSW 构建多层图,从顶层快速定位到目标附近区域,逐层细化:O(log⁡N)O(\log N)
  • 类比:暴力搜索像翻字典每一页,HNSW 像先查目录再翻到对应章节

Q2: pgvector 和专用向量数据库有什么区别?​

答案:

  • pgvector:PostgreSQL 扩展,适合数据量 < 100 万、已有 PG 基础设施的项目,运维简单
  • 专用数据库(Milvus/Qdrant):千万~亿级数据、分布式部署、更丰富的索引和过滤能力
  • 建议:初期用 pgvector 快速验证,数据量增长后迁移到专用数据库

Q3: 向量检索如何实现过滤(metadata filtering)?​

答案:

  • Pre-filtering:先按元数据过滤,再在子集中向量搜索(精确但可能慢)
  • Post-filtering:先向量搜索,再过滤结果(可能返回不够 K 条)
  • Integrated filtering:搜索过程中同时过滤(Qdrant、Milvus 支持)
  • 实践中推荐 integrated filtering,兼顾精度和效率

相关链接​