跳到主要内容

向量数据库深入

问题

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

答案

一、向量数据库全景

二、核心索引算法

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

项目说明
原理逐一计算 query 与所有向量的距离
精度100%(精确搜索)
时间复杂度O(nd)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(logn)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 万
IVF10 万 ~ 1000 万
HNSW很高很快100 万 ~ 1 亿
PQ> 1 亿
HNSW+PQ很快> 1 亿

四、主流向量数据库对比

数据库开源托管索引算法过滤特点
Pinecone自研全托管,开箱即用
MilvusHNSW/IVF/PQ功能最全,适合大规模
QdrantHNSWRust 编写,性能好
WeaviateHNSWGraphQL API
pgvectorHNSW/IVFFlatPostgreSQL 扩展
ChromaHNSW轻量,适合原型
FAISS全部搜索库,非数据库

五、选型决策


常见面试问题

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

答案

  • 暴力搜索需要计算 query 与所有 N 个向量的距离:O(N)O(N)
  • HNSW 构建多层图,从顶层快速定位到目标附近区域,逐层细化:O(logN)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,兼顾精度和效率

相关链接