向量数据库的原理与选型
作者:程序员马丁
Ragent AI —— 从 0 到 1 纯手工打造企业级 Agentic RAG,拒绝 Demo 玩具!AI 时代,助你拿个offer。
上一篇我们把文本 chunk 变成了一组浮点数向量,还用 SiliconFlow 的 API 跑通了一个完整的向量化检索 demo。最后留了一个问题:向量生成之后存到哪里?
当时的 demo 里,我们把所有向量放在一个 List<float[]> 里,查询的时候遍历整个列表,逐个算余弦相似度,取最高的几个。demo 跑得很顺畅,因为只有几条数据。
但你想想实际场景——一个电商平台的知识库,商品说明、退货政策、物流规则、促销活动、FAQ……分块之后轻轻松松几十万甚至上百万个 chunk,每个 chunk 对应一个 4096 维的向量。每次用户提问,你都要拿查询向量和这几十万个向量逐一比较?
这显然不现实。
这一篇,我们就来解决这个问题:向量存到哪里,怎么在海量向量中高效检索。
向量存 到哪里:为什么普通数据库不够用
1. 最直觉的方案:用 MySQL 存向量
既然向量就是一组浮点数,那最直觉的想法就是——存 MySQL 呗。
方案很简单:在表里加一个 TEXT 或 JSON 字段,把向量序列化成字符串存进去。检索的时候把所有向量读出来,在应用层逐个计算余弦相似度,排序取 Top-K。
CREATE TABLE chunk_vectors (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
chunk_text TEXT NOT NULL,
vector JSON NOT NULL, -- 存储 4096 维浮点数向量
doc_id VARCHAR(64),
category VARCHAR(32),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
能跑通吗?能。demo 阶段完全没问题。
但这个方案有一个致命的问题——检索的时候,你必须把所有向量都读出来,在内存里逐个计算相似度。这就是所谓的暴力搜索(Brute-Force Search)。
2. 暴力搜索的性能瓶颈
咱们算一笔账。
假设你的知识库有 100 万个 chunk,每个 chunk 的向量是 4096 维(用的 Qwen3-Embedding-8B 模型)。每次用户提问,系统需要:
- 把用户的问题也向量化,得到一个 4096 维的查询向量
- 从数据库里读出 100 万个向量
- 逐个计算查询向量和这 100 万个向量的余弦相似度
- 排序,取相似度最高的 Top-K 个
第 3 步是瓶颈。每次余弦相似度计算需要做 4096 次乘法 + 4096 次加法 + 开方等运算。100 万个向量就是 100 万次这样的计算。
具体要多久?在一台普通服务器上(单核 CPU),100 万个 4096 维向量的暴力搜索大约需要 2~5 秒。听起来好像还行?
但别忘了:
- 这只是单次查询的耗时,如果有 100 个 用户同时提问呢?
- 数据量还会增长,500 万、1000 万个 chunk 呢?
- 实际的 RAG 系统对延迟很敏感,用户问一个问题不只是向量检索,还有很多其他步骤,体验很差
- 而且每次查询都要把 100 万个向量从磁盘读到内存,I/O 开销也很大
用一张图来直观感受一下暴力搜索的过程:

所以,暴力搜索在数据量小的时候没问题,但一旦数据量和并发量上去,就完全不可用了。
3. 近似最近邻搜索
既然逐个比较太慢,能不能不比较所有向量,只比较其中一部分,就找到大概率最相似的那几个?
答案是可以。这就是 ANN(Approximate Nearest Neighbor,近似最近邻搜索)的核心思想。
注意这里的关键词是“近似”——ANN 不保证找到的一定是全局最相似的向量,但它能在极短的时间内找到非常接近最优解的结果。
打个比方:暴力搜索就像你要在一个 100 万人的城市里找和你最像的人,挨个去比对。ANN 则是先按区域划分,再按特征缩小范围,最后只在一小撮人里精确比较。你可能会错过某个住在偏远角落的“最佳匹配”,但你找到的人已经足够像了,而且速度快了几百倍。
用数字来感受一下差距:
| 指标 | 暴力搜索 | ANN 检索 |
|---|---|---|
| 100 万向量查询耗时 | 2~5 秒 | 1~10 毫秒 |
| 召回率(Recall) | 100%(精确) | 95%~99%(近似) |
| 是否需要专 门索引 | 不需要 | 需要 |
| 适用数据量 | < 10 万 | 百万~亿级 |
110 毫秒 vs 25 秒,速度差了几百到几千倍,而召回率只损失了 1%~5%。在实际的 RAG 场景中,这点精度损失几乎感知不到——你本来就是取 Top-K 个结果丢给大模型做参考,少了一个排名第 47 的 chunk 对最终回答没有影响。
这就是向量数据库存在的核心理由:它不只是存向量,更重要的是提供高效的 ANN 检索能力。普通数据库能存向量,但做不了高效的 ANN 检索。
一句话概括:向量数据库 = 向量存储 + ANN 索引 + 高效检索。它是专门为“在海量向量中快速找到最相似的那几个”这件事而设计的。
向量检索的核心算法:怎么不用逐个比较就能找到最相似的
知道了 ANN 的目标——不逐个比较,快速找到近似最优解——接下来的问题是:具体怎么做到的?
这一节我们讲两种最主流的 ANN 索引算法:IVF 和 HNSW。不涉及数学推导,重点是让你理解它们的核心思想和工程上的取舍。