向量数据库零基础入门:从 MySQL 视角轻松读懂向量检索
作为一名熟悉传统关系型数据库(如 MySQL)的开发者,当你第一次接触到“向量数据库(Vector Database)”、“嵌入(Embedding)”、“余弦相似度”这些概念时,可能会觉得有些抽象和陌生。
其实,向量数据库的底层逻辑和传统数据库有许多相通之处。本文将通过与 MySQL 的对比,带你轻松跨越概念门槛,秒懂向量数据库的核心原理。
一、 核心概念对照表
在正式展开前,我们可以先通过一张概念映射表,将向量数据库的新概念与 MySQL 的已知概念建立连接:
| 概念维度 | 传统关系型数据库 (以 MySQL 为例) | 向量数据库 (Vector DB) |
|---|---|---|
| 数据容器 | 表 (Table) | 集合 (Collection) |
| 基本数据单元 | 行 (Row) | 实体 (Entity) |
| 主键 | 自增 ID / UUID (Primary Key) | 唯一 ID (ID) |
| 数据字段 | 列 (Column) | 属性/载荷 (Payload / Metadata) |
| 核心索引 | B+ Tree 索引 / 哈希索引 | HNSW / IVF (近似最近邻索引) |
| 检索方式 | 精确匹配 (如 WHERE status = 1) |
相似度检索 (寻找距离最近的向量) |
| 查询结果 | 满足条件的确定性记录 | 按相似度降序排列的 Top-K 候选集 |
二、 核心概念深度通俗解读
1. 什么是向量(Vector)与嵌入(Embedding)?
- MySQL 中的数据:在 MySQL 中,我们用字段存储特征。比如一个商品,我们用
color="Red",price=99,category="Shoes"来表示。 - 向量数据库中的数据:在 AI 时代,我们希望计算机理解商品的“语义”。比如,一件“红色的运动鞋”和“粉红色的跑步鞋”在字面上不一样,但语义高度相似。
为了让计算机读懂这种语义,我们会使用 Embedding 模型(如 OpenAI 的 text-embedding-3)把文本或图片转化为一串浮点数数组(如 [0.12, -0.43, 0.98, ... 共1536维])。这一串浮点数就是向量(Vector)。
- 通俗比喻:向量就像是多维空间中的“GPS经纬度”。普通地图只有 X 和 Y 两个维度(经度和纬度),而向量空间有上千个维度。空间中距离越近的两个点,代表它们的语义越相似。
2. 向量检索 vs. SQL 查询
- MySQL 的查询(精确匹配):
sql SELECT * FROM products WHERE name LIKE '%运动鞋%' AND price < 100;MySQL 必须找到完全包含“运动鞋”这三个字,且价格小于100的行。这是一种黑白分明的精确过滤。 -
向量数据库的查询(相似度检索): 向量数据库不进行字面匹配。当用户搜索“跑鞋”时,系统先将“跑鞋”转为向量 $V_{query}$,然后在数据库中寻找距离 $V_{query}$ 最近的那些商品向量。
-
查询结果:返回的不是“是或否”,而是“这个商品与您的输入有 92% 的相似度,那个商品有 88% 的相似度”,并按照相似度高低返回前 K 个结果(即 Top-K 检索)。
3. B+ 树索引 vs. 向量索引 (HNSW / IVF)
- MySQL 的索引 (B+ Tree):
MySQL 的 B+ 树索引非常擅长一维数据的排序和快速查找。例如,找
id = 10或age > 18。它可以通过不断二分,以 $O(\log N)$ 的复杂度快速锁定目标。 - 向量数据库的索引 (以 HNSW 为例):
高维空间(如 1536 维)是无法用 B+ 树排序的(这被称为“维度灾难”)。如果在海量向量中一个一个去计算距离,计算量会爆炸(相当于全表扫描
SecScan)。
因此,向量数据库采用了近似最近邻(ANN,Approximate Nearest Neighbor)算法: * HNSW (分层导航小世界):把高维向量构建成像“社交网络”一样的图结构。检索时,先在顶层“高速路”快速定位大体区域,再在底层“小路”上精细查找,从而在毫秒级内找到最相似的向量。 * IVF (倒排文件索引):将空间划分为若干个聚类(类似于把数据分类装进不同的桶),查询时先定位到最相邻的几个桶,只在桶内进行计算,大大减少计算量。
三、 代码实战对比:从 SQL 到 Vector SDK
让我们通过伪代码来看看,这两种数据库在开发层面的具体差异。
1. 插入数据
- MySQL 方式:
python # 插入一条商品记录 cursor.execute( "INSERT INTO products (id, name, price) VALUES (1, '耐克红运动鞋', 599)" ) - 向量数据库 方式: ```python # 1. 将文本转化为高维向量 vector = embedding_model.embed("耐克红运动鞋") # 返回 [0.12, -0.45, ...]
# 2. 写入向量数据库(包含向量本身,以及作为 Payload 的元数据) client.collection("products").insert( entity_id=1, vector=vector, payload={"name": "耐克红运动鞋", "price": 599} ) ```
2. 查询数据
- MySQL 方式:
python # 严格匹配字面量 cursor.execute("SELECT * FROM products WHERE name LIKE '%红鞋%'") results = cursor.fetchall() - 向量数据库 方式: ```python # 1. 将用户的查询词转化为向量 query_vector = embedding_model.embed("红色的鞋子")
# 2. 向量数据库搜索,寻找距离最近的前 3 个结果 results = client.collection("products").search( vector=query_vector, limit=3, # 也可以带上关系型过滤条件 filter="price < 800" ) ``` 尽管用户输入的词是“红色的鞋子”,并不完全匹配“耐克红运动鞋”的字面,但由于它们在语义空间非常接近,向量数据库依然能精准地把“耐克红运动鞋”作为高相似度结果返回。
四、 总结与学习建议
- 向量数据库不能完全替代 MySQL:向量数据库是为了处理高维非结构化语义检索而生的。它在事务性(ACID)、复杂关联查询(JOIN)等方面不如传统关系型数据库。
- 混合检索 (Hybrid Search) 是主流:在当前的 AI 应用(如 RAG 知识库)中,我们通常将二者结合使用。将业务元数据作为 Payload 存入向量数据库,在检索向量的同时进行标量过滤(例如:只检索
user_id = 10086的文档向量)。
希望这篇对照介绍能帮助你理清向量数据库的基本概念。当你下次在 AI 项目中需要存储知识库、实现语义搜索时,就可以自信地挑起一款向量数据库开始你的 AI 探索之旅了!
本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。



暂无评论
还没有人评论过本文,快来发表你的高见吧!