Py学习  »  DATABASE

百度面试官冷笑:“RAG 不用向量数据库,用 MySQL 硬扛?”,我:“呃… 100 万向量遍历要多久?”

JavaGuide • 1 周前 • 45 次点击  

前段时间面某大厂的时候,面试官问我:“你们 RAG 系统的向量检索怎么做的?”,我说:“用 MySQL 存 Embedding,查询时遍历计算相似度。”

空气突然安静了五秒。我看到面试官的嘴角抽了一下,才意识到问题大了——当时我们知识库有 50 多万条 Chunk,每次查询都要全表扫描,平均响应时间 3 秒+,用户早就跑光了。

面试被挂后才懂:这叫“暴力搜索”,而生产级方案应该是向量数据库 + ANN 索引

段子归段子,向量数据库确实是当下 RAG 应用的基础设施,也是 AI 应用开发面试的高频考点。今天 Guide 分享几道向量索引算法和向量数据库相关的问题,希望对大家有帮助,非常清晰易懂:

  1. ⭐️ RAG 场景为什么需要向量数据库?
  2. ⭐️ 什么是向量索引算法?
  3. 有哪些向量索引算法?
  4. ⭐️ 你的项目使用的什么向量索引算法?
  5. HNSW 索引和 IVFFLAT 索引的区别是什么?
  6. 有哪些向量数据库?
  7. ⭐️ 你为什么选择 PostgreSQL + pgvector?
  8. 为什么不选择 MySQL 搭配向量数据库呢?

⭐️ RAG 场景为什么需要向量数据库?

RAG(Retrieval-Augmented Generation)的核心是"语义检索"——把文档和用户问题都转成高维向量(Embedding),然后找最相似的 Top-K 片段作为 LLM 上下文。传统关系型数据库(MySQL、PostgreSQL 原生)或全文搜索引擎(ES 的 BM25)无法高效完成这件事,所以必须引入向量数据库(或带向量扩展的数据库)。

RAG 场景为什么需要向量数据库?
RAG 场景为什么需要向量数据库?

1. 高维向量相似度搜索

Embedding 通常是 768~3072 维的稠密向量,传统数据库只能用 = 或 LIKE 做精确匹配,无法计算"余弦相似度 / 内积 / 欧氏距离"。

暴力搜索:如果强行用 SQL 遍历全表计算相似度,复杂度是 O(n)。以 100 万条 1024 维向量为例:

  • 单次查询计算:1,000,000 × 1,024 次乘法运算
  • 实际延迟:秒级(具体数值因硬件而异)

秒级延迟——对于需要实时响应的问答系统完全不可接受。

ANN 近似检索:向量数据库专为最近邻搜索(ANN, Approximate Nearest Neighbor)设计,通过图导航或空间划分大幅减少距离计算次数,将检索延迟降至毫秒级

指标
暴力搜索
ANN 索引检索
时间复杂度
O(n)
图索引 ≈ O(log n),聚类索引 ≈ O(nprobe × n/nlist)
100 万向量延迟
秒级
毫秒级
召回率
100%
95-99%
速度提升
基准
100-200 倍

注:上表延迟为数量级描述,实际性能因硬件规格、并发负载、索引参数(如 ef_searchnprobe)而异,建议参考 ann-benchmarks.com[1] 在目标环境验证。

用不到 5% 的召回率损失,换来 100 倍以上的速度提升——这就是索引的价值。

2. 大规模数据承载能力

RAG 知识库动辄几十万 ~ 亿级 Chunk,向量数据库支持亿级向量持久化 + 增量更新 + 分片,而传统 DB 存向量后基本无法扩展。

3. 语义检索 vs 关键词检索的本质区别

检索方式
原理
局限性
BM25 关键词
字面匹配,基于词频统计
遇到同义词/改写就失效("退货" vs "退款流程")
向量语义搜索
Embedding 捕获语义相似性
理解同义词、上下文、隐含意图

文档的 Chunking 策略(切分规则与重叠度)与 Embedding 模型共同决定了语义召回的理论上限,而向量数据库则是以满足生产延迟要求的方式将这一上限落地的执行引擎。

生产级必备能力

  • 支持元数据过滤(如 WHERE category='Java' AND version>='v2')+ 向量相似度联合查询
  • 混合检索(Hybrid Search):向量 + BM25 + RRF 融合(生产环境常用方案之一)
  • 动态更新:支持增量写入。但需注意:HNSW 在高频删除/更新场景下,被删除的向量以"标记删除"方式残留,积累的 dead nodes 会导致召回率随时间下滑,需定期通过 REINDEX 或 vacuuming 机制清理,并监控实际召回率
  • 权限/多租户隔离:企业级 RAG 必备

⭐️ 什么是向量索引算法?

向量索引算法是向量数据库的核心,它的核心任务是解决一个数学难题:如何在海量的高维向量中,极速地找到和给定查询向量最相似的那几个。

它的本质,是一种空间划分和数据组织的艺术。如果没有索引,我们要找一个相似向量,就必须把数据库里所有的向量都比较一遍,这叫暴力搜索。在百万、亿级的数据量下,这种方法的延迟是灾难性的。

向量索引的目标,就是通过预先组织好数据,让我们在查询时能够智能地跳过绝大部分不相关的向量,只在一个很小的候选集里进行精确比较。

用生活化的比喻来说:

  • 没有索引 = 在整个城市挨家挨户找一个人
  • 有索引 = 先确定在哪个区 → 哪条街 → 哪栋楼 → 快速定位

在实践中,向量索引算法主要分为两大类:

向量索引算法分类
向量索引算法分类

1. 精确最近邻(Exact Nearest Neighbor, ENN)算法:

  • 目标: 保证 100% 找到最相似的那个向量。
  • 代表: 像 KD-Tree, VP-Tree 这类传统的空间树结构。
  • 问题: 它们在低维空间(比如 10 维以内)效果很好,但在 AI 领域动辄几百上千维的高维空间中,它们的性能会急剧下降,遭遇 维度灾难,最终退化成和暴力搜索差不多的效率。

2. 近似最近邻(Approximate Nearest Neighbor, ANN)算法:

  • 目标: 这是现代向量检索的核心。它做出了一个非常聪明的工程权衡放弃 100%的准确性,换取查询速度几个数量级的提升。它不保证一定能找到那个最相似的,但能保证以极大概率(比如 99%)找到的向量,也已经足够相似了。
  • 代表: 这类算法是现在的主流,主要有三大流派:基于图的(Graph-based): 如 HNSW。它把向量组织成一个复杂的多层网络图,查询时像导航一样在图上行走,速度极快,召回率非常高,是目前综合表现最好的算法之一。基于量化的(Quantization-based): 如  IVF_PQ。它通过聚类和压缩技术,把海量向量压缩成很小的数据,极大地降低了内存占用,非常适合超大规模的场景。基于哈希的(Hashing-based): 如 LSH。它通过特殊的哈希函数,让相似的向量有很大概率落入同一个哈希桶,从而缩小搜索范围。

所以,当我们谈论向量索引时,我们绝大多数时候谈论的都是ANN 算法

选择并调优一个合适的 ANN 索引,是决定一个 RAG 或向量搜索系统最终性能和成本的关键,带来的性能提升确实可以达到百倍甚至千倍以上。

有哪些向量索引算法?

在向量数据库与 RAG(检索增强生成)应用中,索引算法直接决定了系统的召回率、响应延迟和资源消耗。

这里需要区分两个层级概念:

层级
示例
说明
向量数据库
Milvus、Qdrant、pgvector
负责向量存储、检索和管理的完整系统
其支持的索引算法
HNSW、IVF-PQ、IVFFLAT、Flat
决定检索性能与召回率的内部实现

主流索引算法一览

算法名称 原理机制核心优势主要劣势适用数据规模
Flat (暴力搜索)
遍历所有向量计算距离
100% 准确无损
O(n) 复杂度,查询极慢
< 10 万
HNSW (图索引)
分层导航的小世界图
查询极快,召回率极高
内存消耗巨大,构建耗时
10 万 - 1000 万
IVFFLAT (倒排聚类)
聚类 + 倒排索引桶
内存效率高,构建快
需前置训练,召回率略低
1000 万 - 1 亿
IVF-PQ (乘积量化)
聚类 + 向量极致压缩
支持海量数据,开销极低
精度损失较大
> 1 亿
IVF_RABITQ
聚类 + 随机旋转比特量化
内存占用极低,召回率优于 PQ
较新算法,生态支持有限
> 1 亿

关于 IVF_RABITQ:这是 2024 年提出的新一代量化算法,核心创新是  Random Rotation(随机旋转)+ Bit Quantization(比特量化)。相比传统 PQ 将向量切成子向量再分别聚类,RABITQ 先对向量做随机旋转使各维度分布更均匀,再将每个维度量化为 1 bit(仅保留符号位)。这种设计在保持高召回率的同时,将内存占用压缩到原始向量的 1/32,且距离计算可高效使用位运算加速。在 Milvus 2.5+ 中已作为 IVF_RABITQ 索引类型提供。

⭐️ 你的项目使用的什么向量索引算法?

这里以 《SpringAI 智能面试平台+RAG 知识库》项目为例。

在我们的项目中,使用的是 PostgreSQL 的 pgvector 扩展,并配置了 HNSW 索引

为什么选择 HNSW?  因为在百万级数据规模下,HNSW 在检索速度、召回率和内存占用之间取得了最佳平衡。

我们可以把 HNSW 理解成一个多层高速公路网络

HNSW索引架构
HNSW索引架构

核心机制:

  1. 层次化构建: 节点的最高层级由公式 level = floor(-ln(random()) * mL) 决定,其中 mL 是层级乘数。这使得越高的层级节点数 指数级递减,形成"金字塔"结构。
  2. 贪心搜索:检索从顶层开始,每层都贪心地移动至距离查询点最近的邻居节点。
  3. 由粗到精:上层用于快速定位语义区域,下层用于执行精确查找。

这种"由粗到精"的查找方式,能够极快地定位到最近邻向量,而不需要像暴力搜索那样比较每一个点。

HNSW 的本质是近似最近邻(ANN)算法,意味着它为了追求极致速度,无法保证 100% 的召回率。但在实践中,通过调整参数,召回率可以达到 99% 以上,对于 RAG 应用完全足够。

调优参数:

  • m:每个节点的最大连接数。m 值越大,图越密集,召回率越高,但会增加构建时间和内存消耗。
  • ef_construction:索引构建时的搜索范围。该值越大,索引质量越高,但构建越慢。
  • ef_search:查询时的搜索范围。这是最重要的运行时参数,直接影响查询速度和召回率的平衡

扩展性考虑:

HNSW 是非常耗内存的索引。如果未来数据规模增长到千万甚至亿级,或者对写入吞吐量有更高要求,HNSW 的内存占用和构建成本可能成为瓶颈。

届时可以考虑切换到 IVFFLAT 索引。IVFFLAT 基于倒排索引思想,通过将向量空间聚类成多个桶来缩小搜索范围。或者引入 Milvus 等专业向量数据库,它们在分布式、大规模场景下提供更专业的解决方案。

过滤行为注意:

pgvector 0.5+ 的 HNSW 索引在执行元数据过滤时,采用混合过滤策略:过滤条件在索引扫描期间并行评估,而非纯后过滤。但若过滤条件较严格,仍可能导致最终结果远少于 Top-K 预期。

例如,查询"返回 10 条相似文档中 category='Java' 的记录",若候选集中只有 3 条满足条件,则仅返回 3 条。解决方案包括:

  1. 增大候选集:设置更大的 ef_search 或 LIMIT,让更多候选进入过滤阶段
  2. 预过滤(Pre-filtering):先按元数据过滤再执行向量搜索,但可能导致索引失效退化为暴力搜索
  3. 部分索引(Partial Index):PostgreSQL 支持带条件的 HNSW 索引,如  CREATE INDEX ... WHERE category = 'Java',但需为每个常见过滤条件创建独立索引

HNSW 索引和 IVFFLAT 索引的区别是什么?

这两者的核心区别在于:一个是利用的连通性寻找邻居,一个是利用聚类缩小搜索范围。

HNSW(图索引)

  • 原理:构建多层图结构。查询像在"高速公路"上行驶,先大跨度跳跃,再局部精细搜索
  • 优点:检索速度极快,召回率非常稳定且高
  • 缺点 内存消耗大,除了原始向量,还要存储大量节点间的连接关系;索引构建非常慢

IVFFLAT(倒排聚类)

  • 原理:利用 K-Means 将向量空间切分成多个"桶"。查询时先找最近的几个桶,只在桶内进行暴力搜索
  • 优点内存友好,结构简单,索引构建速度比 HNSW 快 4-32 倍(取决于 nlist 参数和硬件)
  • 缺点:检索速度略慢于 HNSW(在高精度要求下);如果数据分布改变,需要重新训练聚类中心
特性
HNSW(图索引)
IVFFLAT(倒排聚类)
底层原理
层次化小世界图结构
聚类 + 倒排桶结构
查询速度极快
中等
内存消耗 极高
(原始向量 + 图连接指针)
中等(原始向量 + 质心),低于 HNSW
构建速度
慢(需逐个节点插入)
快 4-32 倍
(依赖 K-Means 训练)
数据动态性
增量添加方便,但删除需定期 REINDEX
建议全量训练,否则精度下降
适用规模
10 万 - 1000 万
1000 万 - 1 亿

如何选择?

  • 选 HNSW:数据在百万级,追求毫秒级极速响应,且服务器内存充足
  • 选 IVFFLAT:数据达到千万甚至亿级,或内存资源受限,能接受稍长的查询延迟

有哪些向量数据库?

对于向量数据库的选型,适合项目的才是最好的,没有银弹!

第一类:传统数据库扩展

  • 代表:PostgreSQL + pgvector 插件(最成熟的选择,生产环境验证充分)、MongoDB Atlas Vector Search(NoSQL 领域的向量扩展)
  • 核心优势:
    • 统一技术栈: 无需引入新的数据库系统,降低运维复杂度
    • 事务一致性: 向量数据和业务数据可以在同一事务中管理,保证 ACID 特性
    • 学习成本低: 团队已有的 SQL 知识可以复用
    • 混合查询便利: 可以轻松结合 SQL 过滤条件进行向量搜索
  • 适用场景:项目初期或中小型项目中的首选。特别是在业务数据(如文档元数据)和向量数据需要强一致性、能在同一个事务里管理时,它的优势巨大。它极大地降低了技术栈的复杂度和运维成本,对于已经在使用 PG 的团队来说,学习曲线几乎为零。

第二类:搜索引擎演进

  • 代表: Elasticsearch、OpenSearch(AWS 维护的 ES 分支,向量功能持续增强)。
  • 核心优势:
    • 混合搜索(Hybrid Search)能力强大: 可无缝结合 BM25 关键词搜索和向量语义搜索
    • 全文检索能力: 处理长文本、支持高亮、分词等传统搜索特性
    • 成熟的分布式架构: 横向扩展能力强
    • 丰富的聚合分析: 支持 facet、aggregation 等分析功能
  • 适用场景: 需要同时支持关键词和语义搜索;电商搜索、文档检索等复合查询场景;已有 ES 技术栈的团队;需要复杂过滤和聚合的场景。

第三类:原生专业向量数据库

  • 代表:Milvus(功能最全面、社区最庞大)、 Weaviate(内置 AI 模块,支持 GraphQL 查询,易用性好)、Qdrant(Rust 编写,内存效率高,支持丰富的过滤器)。
  • 核心优势:
    • 专为向量优化: 支持多种索引算法(HNSW、IVF、LSH 等)
    • 规模化能力: 可处理十亿级向量
    • 性能极致: 专门的内存管理和索引优化
    • 功能丰富: 支持多种距离度量、动态更新、增量索引等
  • 适用场景: 当我们的向量数据规模达到亿级甚至更高,或者对 QPS 和延迟有非常苛刻的要求时,这些专业的向量数据库通常会提供比 pgvector 更好的性能和更丰富的功能(如更高级的索引算法、数据分区、多租户等)。当然,选择这条路也意味着我们需要投入更多的运维和学习成本

第四类:云托管的向量数据库服务

  • 代表:Pinecone(市场的开创者和领导者)、Zilliz Cloud(Milvus 的商业版)、Weaviate Cloud等。
  • 核心优势:
    • 低运维: 全托管服务,自动扩缩容(仍需配置索引参数和监控召回率)
    • 高可用保证: SLA 通常 99.9%+
    • 快速上线: 几分钟即可开始使用
    • 弹性计费: 按实际使用量付费
  • 适用场景: 对于追求快速上线、希望降低运维负担、并且预算充足的团队,这是一个非常有吸引力的选择。它让我们能把所有精力都聚焦在 AI 应用本身的业务逻辑上,而无需关心底层数据库的运维细节。

⭐️ 你为什么选择 PostgreSQL + pgvector?

这里以 《SpringAI 智能面试平台+RAG 知识库》项目为例。本项目需要同时存储结构化数据(简历、面试记录)和向量数据(文档 Embedding)。

方案对比

方案
优点
缺点
适用规模
PostgreSQL + pgvector
一套数据库搞定,运维简单
百万级以上性能下降明显
< 100 万向量
PostgreSQL + Milvus
向量检索性能更好
多一个组件,运维复杂度增加
100 万 - 10 亿
Pinecone / Zilliz Cloud
全托管,低运维
成本高,数据在第三方
任意规模

选择 pgvector 的理由

  • 架构简单:不引入额外组件,降低部署和运维复杂度。
  • 性能够用:HNSW 索引支持毫秒级检索,百万级以下文档场景完全够用。
  • 事务一致性:向量数据和业务数据在同一数据库,天然支持事务。
  • SQL 查询:可以结合 WHERE 条件过滤(注意:过滤条件可能导致向量索引失效,需检查执行计划)。
-- pgvector 余弦相似度搜索示例
-- <=> 是余弦距离运算符(0 = 完全相同,2 = 完全相反)
-- 余弦相似度 = 1 - 余弦距离
SELECTcontent1 - (embedding <=> $1as cosine_similarity
FROM vector_store
WHERE  metadata->>'category' = 'Java'
ORDERBY embedding <=> $1-- 按距离升序,越小越相似
LIMIT5;

-- ⚠️ 关键前提:查询时使用的距离运算符必须与创建 HNSW 索引时指定的
-- operator class(例如 vector_cosine_ops)严格保持一致,否则查询将
-- 无法命中索引,直接退化为全表扫描。
-- 验证方式:EXPLAIN ANALYZE 检查执行计划是否包含 Index Scan。

为什么不选择 MySQL 搭配向量数据库呢?

PostgreSQL 最大的优势,也是它在 AI 时代甩开对手的"王牌",就是其强大的可扩展性。开发者可以在不修改内核的情况下,为数据库安装各种功能插件:

  • AI 向量检索pgvector 扩展(官方推荐,性能在百万级场景下接近专业向量库)
  • 全文搜索:内置 tsvector(基础需求),或  pg_bm25 扩展(高级需求)
  • 时序数据TimescaleDB 扩展
  • 地理信息PostGIS 扩展(行业标准)

这种"一站式"解决能力意味着许多项目不再需要依赖 Elasticsearch、Milvus 等外部中间件,仅凭一个 PostgreSQL 即可满足多样化需求,从而简化技术栈。

注意:MySQL 8.x 系列(包括 8.4 LTS)无官方向量支持。MySQL 9.0(2024 年 7 月发布)才正式引入 VECTOR 数据类型及 STRING_TO_VECTORVECTOR_TO_STRING等向量函数,但目前尚不支持向量索引(ANN),仅能做暴力计算。生态成熟度和生产验证案例远少于 pgvector。如果项目已深度绑定 MySQL 生态,可考虑 MySQL 9.0+ 基础方案(小规模)或 MySQL + 外部向量库的组合。

关于 MySQL 和 PostgreSQL 的详细对比,可以参考我写的这篇文章:MySQL vs PostgreSQL,如何选择?

⭐️ 更多 RAG 高频面试题

上面的内容摘自我的星球实战项目教程: 《SpringAI 智能面试平台+RAG 知识库》。内容安排如下(已经更完,一共 13w+ 字)

配套教程内容概览
配套教程内容概览

Spring AI 和 RAG 面试题两篇加起来就接近 60 道题目,主打一个全面!

RAG 面试题
RAG 面试题

项目地址 (欢迎 Star 鼓励):

  • Github:https://github.com/Snailclimb/interview-guide
  • Gitee:https://gitee.com/SnailClimb/interview-guide

完整代码完全免费开源,没有 Pro 版本或者付费版!

参考资料
[1] 

ann-benchmarks.com: https://ann-benchmarks.com

图片

⭐️「AI 核心技术与面试实战」系列文章:

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/194320