最近被问得最多的一个问题就是:关系型数据库和张量数据库到底有什么本质区别。上周开技术评审会,还有同事拿着张量数据库的宣传文章问我,说这玩意儿是不是要把 MySQL 淘汰了。当时我就觉得,这类问题不适合在会议室里拍脑袋回答,值得认真写一篇东西聊透。
关系型数据库和张量数据库,名字里都带“数据库”三个字,但它们的出身、设计目标、工作方式几乎完全不同。关系型数据库的核心是把数据劈成一张张有严格结构的二维表,用 SQL 精确查询,靠 ACID 保事务;张量数据库的核心则是把数据当成多维数组,也就是张量,来存储和计算,尤其擅长对高维向量做近似检索。理解了这一点,你就能明白“谁替代谁”这个问题本身就是个伪命题。
这篇文章适合这几类人看:正在做技术选型的数据工程师;需要存 embedding 和做向量检索的算法工程师;以及被“张量数据库”概念搞得很兴奋、但又不想盲目跟风的朋友。我会从数据模型、查询方式、索引结构、事务一致性、典型落地场景几个方面逐项对比,最后附上我在实际项目里踩过的坑。不用把这两类数据库捧成对立面,它们各自解决不同的问题,配合得好才是真的值钱。
1. 先搞明白这两个数据世界分别是怎么运转的
1.1 关系型数据库是业务系统里的“秩序派”
关系型数据库的诞生要追溯到上世纪70年代,核心思想是“关系模型”,说白了就是把数据抽象成二维表。每一张表有固定的列结构,每一行是一条记录,每一列都有明确的数据类型和约束,表与表之间通过主键、外键维持关系。MySQL、PostgreSQL、Oracle、SQL Server都是典型的代表。
为什么这种结构能统治数据库领域几十年?因为早期应用最头疼的问题不是“数据量大”,而是“数据乱”。财务数据、库存数据、用户订单,每一条记录都必须准确,不能出现“扣了款但订单没生成”这种事故。关系型数据库通过预定义 schema、主键约束、外键关系、唯一性约束把数据的形状死死钉住,再通过事务和锁机制保证并发写入不会被互相干扰。你可以把它想象成一个管理严格的大型仓储,每个货架有编号,每件货品有固定仓位,进出都要登记,账实必须一致。
但严格是有代价的。表结构一旦定好,要加字段、改类型、调整关系,往往需要走迁移流程,生产环境一次 DDL 可能锁表、可能引起服务抖动。凡是字段频繁变化、数据形态高度非结构化的场景,关系型数据库用起来就特别别扭。即便后来出现了 JSON 类型、NoSQL 化的 MySQL 变种,本质上也还是在二维表的框架里做修补。它几十年屹立不倒,靠的正是“有序、可预期、不犯错”这一套,而不是灵活。
1.2 张量数据库是为 AI 数据准备的新仓库
张量数据库是跟着深度学习落地而出现的新物种。深度学习模型内部和输出的东西,本质上都是张量:一个数值是0维张量,一个向量是1维张量,一张图片经过特征提取得到一个高维向量或特征图,一批样本打包就是更高维的张量。过去这些数据要么直接放在文件里,要么临时塞在内存里,要么干脆作为 BLOB 字段堆在关系型数据库里。数据量到了百万、千万级,查询延迟拉胯,这种草率做法就完全撑不住了。
于是出现了以张量为“第一公民”的数据库。它们把张量的存储、索引、检索、在线更新作为核心功能,内置专门的向量索引算法,比如 HNSW、IVF、PQ 等,支持按相似度召回 TopK 结果,有些还支持和深度学习框架打通,直接在批量张量上做聚合、过滤、降维。行业中有些产品叫向量数据库,有些直接叫张量数据库。向量可以看成1维张量,所以做向量检索的库是张量数据库的一个特化分支。这个定义目前还在演进,但核心思路是一致的:让“找相似”这件事变得又快又准。
1.3 为什么“谁替代谁”是个伪命题
把这两类数据库放在对立面,是刚接触张量数据库的人最容易掉的坑。关系型数据库解决的核心问题是“确定性数据的高可靠存取和事务一致性”,张量数据库解决的核心问题是“非结构化数据的多维表示和相似度检索”。它们解决的问题不同,处理数据的形态不同,应用的业务场景也不同。
我见过一个真实的电商系统:订单表放在 MySQL 中,用户行为序列通过模型编码成 embedding 后放进张量数据库做相似召回。两者协同工作,各管一摊,毫无冲突。硬拿关系型数据库去替代张量数据库,会在千万级向量的线性扫描里把查询性能拖垮;反过来让张量数据库去管订单事务,它连最基本的外键约束和秒级强一致都没法保证。理解各自的边界,比急着站队重要得多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心差异逐项拆解:数据模型、查询语义与存储机制
2.1 数据模型:二维表 vs 任意维张量
关系型数据库的数据模型是表,由行和列构成。每一列必须预先定义类型和约束,每一行代表一条记录。比如用户表可以有 user_id、name、age、email 这些列,查询结果永远是二维结果集。这种模型非常规整,适合表达“实体 + 属性 + 关系”的网状业务结构,在需求明确、规则稳定的系统中尤其好用。
张量数据库的数据模型则是张量,也就是多维数组。每个元素有下标和数值,整个张量有 shape 属性,比如 (10000, 768) 表示一万条 768 维的向量。这种模型本质上更适合表达模型的中间表示和特征输出,而不是复杂的主外键关系。有些张量数据库支持给向量附带 metadata,比如业务标签、时间戳、原始文档内容,但这些属于外围能力,核心还是多维数组的存取和计算。
从工程角度判断也很简单:如果数据实体之间有明确的关系约束,并且需要频繁做条件过滤和联表统计,优先考虑关系型数据库;如果数据是模型算出来的特征向量,需要按距离做相似召回,张量数据库才是顺势而为的选择。数据形态决定数据库形态,这是最底层的判断依据。
2.2 查询方式:SQL 确定性查询 vs 相似度近似检索
关系型数据库的查询语言是 SQL,它是声明式的:你说“我要什么”,数据库优化器负责“怎么查”。查询结果要求确定、精确。比如“查出销售额大于一万的订单”,返回的一定是精确匹配集合。SQL 还支持 JOIN、聚合、子查询、窗口函数,表达能力极强,底层本质是对有序或索引结构做精确查找和运算。
张量数据库的查询语言目前还没有统一标准,多数产品提供类似 SQL 的过滤语法,但核心检索动作是“近似最近邻搜索”:给一个查询向量,返回距离最近的前 K 条向量。举个例子,SQL 查询是“SELECT * FROM product WHERE category = '手机'”,张量数据库的典型查询则是“给定一个图像向量,返回与之最相似的 10 个商品向量”。返回结果基于向量距离排序,带有近似性。一些产品开始支持混合检索,比如“先按品牌过滤,再在过滤结果里做相似度召回”,但距离计算仍是主路径。
这带来一个很实际的心理预期差异:关系型数据库的查询结果可以复现、可以校对,账上少了十块钱你一查便知;张量数据库的召回结果可能因为索引参数、距离算法、数据更新的不同而略有浮动。做搜索、推荐、多模态匹配时可以接受这种近似性,但做对账、审计算账时绝对不能接受。
2.3 事务与一致性:ACID 和宽松一致性
关系型数据库把 ACID 当成生命线。原子性保证一个事务要么全部执行要么全部不执行,一致性保证事务前后数据规则不被破坏,隔离性保证多个事务互不干扰,持久性保证一旦提交数据不丢。银行转账、库存扣减、订单状态流转,这些业务靠 ACID 才敢放心让系统自动执行。
张量数据库在这块的态度要务实得多。它更关心高吞吐写入和低延迟召回,通常提供较弱的一致性模型,比如最终一致性或不保证跨分片强一致。原因有两个:一是特征数据通常来自模型的批量编码,写多读多但很少需要跨多条向量做原子更新;二是为了在分布式环境下保持近邻图索引的构建效率,强一致协议的成本太高。
因此做架构设计的时候要有清醒认识:用户余额、订单状态这类“不可出错”的数据别放张量数据库;索引更新也不是改了原数据就立刻生效,需要重新编码、重新写入,有时还要等待索引段合并。需要强一致的关键业务数据继续放在关系型库,需要高并发向量召回的特征数据放张量库,是目前最稳健的分工方式。
2.4 存储引擎与索引机制:B+ 树与近邻图
关系型数据库最经典的存储结构是 B+ 树。B+ 树的叶子节点链式相连,查询某个确切 key 的复杂度是 O(log n),非常适合精确匹配、范围查询和排序。为了支持多条件过滤,还要设计组合索引,遵循最左前缀原则。它的核心优化目标是尽量降低磁盘随机 IO,把磁盘预读能力发挥到极致。
张量数据库的索引机制完全不同。它要回答的问题是“给一个查询向量,怎么快速找到距离最近的向量”。精确计算所有向量距离再排序,也就是暴力扫描,在千万级规模下不可接受。工程上普遍采用近似最近邻索引,常见算法包括 HNSW、IVF、PQ 以及它们的组合。HNSW 构建一张多层的近似图,查找时沿图快速收敛到目标区域,在召回率和查询速度之间找平衡点。
两种索引没有谁更高级,只取决于任务类型。B+ 树适合“查找某个确定的主键或主键范围”,ANN 索引适合“找出特征空间里最接近的邻居”。把 ANN 索引硬套在精确主键查找上,画蛇添足;把 B+ 树用在向量检索上,数据量一大就原形毕露。理解了这一层,很多选型纠结都会消失。
2.5 差一点,一张对照表给你全局视角
| 对比维度 | 关系型数据库 | 张量数据库 |
|---|---|---|
| 核心数据模型 | 二维表(行/列) | 多维张量(向量/矩阵/高维数组) |
| 典型产品 | MySQL、PostgreSQL、Oracle | Milvus、Qdrant、Weaviate 等 |
| 查询方式 | SQL 精确查询、JOIN、聚合 | 相似度检索、TopK 召回、向量过滤 |
| 索引机制 | B+ 树、Hash、组合索引 | HNSW、IVF、PQ 等 ANN 索引 |
| 事务能力 | 完整 ACID | 弱一致或最终一致 |
| 数据确定性 | 结果精确可复现 | 近似召回,结果有浮动 |
| 典型场景 | 订单、账务、ERP、CRM | 推荐、搜索、多模态检索、AI 特征存储 |
| 扩展重点 | 分库分表、读写分离 | 分布式分片、索引构建吞吐 |
这张表不是让你背结论,而是帮你建立判断坐标。每次纠结技术选型时,把业务需求往表里一套,答案基本就出来了。
3. 选型判断与混合架构:从业务场景反推技术栈
3.1 这些场景请继续坚守关系型数据库
先说结论:只要业务对“数据准确、事务完整、规则明确”有硬性要求,关系型数据库就是最稳的选择。典型场景包括订单系统、支付清结算、库存管理、权限体系、配置中心、运营后台。这些数据的读取频率可能很高,但每条记录都有明确的业务含义和强关联关系,删改需要严密的约束和审计。
我在给一个中小规模电商系统做架构时,第一版有人提出“用户行为数据用向量库存吧”,理由是未来要做个性化推荐。我直接否了。用户行为数据的核心价值是准确离线分析,订单、支付、物流这些事实数据必须进 MySQL,行为日志可以进消息队列再落数据仓库,等模型训练时才编码成向量放进张量库。分清楚数据的主用途,比追逐新概念重要得多。
3.2 这些场景应该尽早引入张量数据库
当数据变成“模型输出的特征表示”,且查询本质是“找最相似的 TopK”,张量数据库的价值立刻显现。典型场景包括语义搜索引擎:把 query 和文档都编码成向量,检索时靠向量距离找相关文档;以图搜图:把图片编码成 embedding 后做近邻召回;推荐系统:把用户兴趣和商品画像向量化后做协同召回;大模型知识库问答:把文档切片编码向量后做相似段落召回,再拼给大模型生成答案。
这类场景有两个共同特征:数据规模大,纯暴力计算撑不住;查询结果是“相似集合”而非“精确单条”。如果你的项目符合这个描述,向量规模跨过十万级,查询响应要求亚秒级,那就值得引入张量数据库。起步阶段可以用开源版本在单机跑通,验证召回效果,再考虑生产部署。不要一开始就堆集群,先证明业务价值。
3.3 一个混合架构的真实落地示例
我参与过的一个智能客服项目,就很好地说明了二者协作方式。业务侧用 MySQL 记录工单、坐席分配、客户资料和状态流转,这部分要求强一致,绝不能用近似检索替代。算法侧把历史工单的文本切片通过预训练模型编码成 768 维向量,写进张量数据库。用户提一个新问题时,系统先在张量库里召回最相近的历史工单切片,把结果喂给大模型做答案生成,同时从 MySQL 查出客户的会员等级、订单信息用于个性化回答。
这套架构里的关键设计是:MySQL 的表结构完全不用因为引入向量检索而改变,张量数据库只记录“向量的唯一业务 id”,也就是把文本切片的 id 作为 metadata 存下来。召回阶段拿到 id 列表后,再去 MySQL 按主键回表取详细记录。两边各干各擅长的活,数据通过业务主键关联。相比把向量塞进 MySQL 的 JSON 字段再在应用层暴力扫描,查询延迟从秒级降到了几十毫秒。
这里贴一段简化的流程伪代码,方便你理解:
python复制# 1. 用户新问题进来
question = "我的订单为什么还没有发货?"
# 2. 用文本编码模型生成查询向量
question_vec = encode_model.encode(question)
# 3. 在张量数据库中召回最相近的历史工单切片id
top_ids = vector_db.search(question_vec, top_k=5)
# 4. 用业务id回MySQL取完整工单记录
history_tickets = mysql.query(
"SELECT * FROM ticket WHERE id IN (%s)" % ",".join(top_ids)
)
# 5. 把历史记录拼进prompt,送给大模型生成答案
answer = llm.generate(question, history_tickets)
严格说这套流程里张量数据库和关系型数据库承担的是不同层级的任务,混在一起比较没有意义,配合起来才有意义。
4. 真实落地中踩过的坑与排查笔记
4.1 把向量硬塞进关系型库,为什么越查越慢
很多团队的第一反应是把 embedding 存在 MySQL 的 BLOB 或 JSON 字段里,查询时全表扫描算距离。数据量几百条时可以忍,到十万条就彻底崩了,一次查询要跑几秒甚至几十秒。问题不在 MySQL 本身,而在于你让它做了不擅长的事:B+ 树索引不支持“按向量距离排序”,它只能把向量当成不透明的大字段读出来,再在应用层算余弦距离或者内积。
如果暂时换不掉架构,有几个土办法可以缓解:减少参与计算的维度,用 PCA 或自编码器把 768 维降到 128 维;按业务标签预分组,先过滤再计算;或者把向量横向拆成多个浮点列建索引。这些方案在十万级规模下还能忍,到了百万级必然失效。我的建议是,向量规模跨过十万级而且查询响应要求低于一秒,就别在关系型库上硬扛了,直接引入专业的张量数据库或向量索引组件。方向选错,后面再怎么优化都是加法,不是乘法。
4.2 近似检索结果不理想,可能不是数据库的问题
张量数据库召回的准确率,很大程度取决于向量本身的质量,而数据库只负责索引和搜索。我自己踩过的一个典型案例:一开始用预训练模型直接输出整句话的 embedding,召回结果特别差,因为句子长度差异大,向量空间中语义距离和用户期望不一致。后来换成专门优化过的文本向量模型,并做了归一化处理,召回效果立刻改善。
另一个常见坑是忽略索引参数。HNSW 的 efSearch 参数越大,召回越准但延迟越高,M 参数影响图的质量和内存占用;IVF 的 nlist 决定聚类数量,nprobe 决定查询时搜索的聚类数量。这些参数不是越大越好,需要结合数据集大小和延迟目标做调优。如果排查时只盯着“数据库好不好用”,忽略向量和索引参数,你很容易得出错误结论,把锅甩给数据库。
4.3 混合架构下双写一致性怎么处理
关系型数据库和张量数据库各自独立存储,就会碰到同一个业务对象写两份数据的一致性问题。比如用户资料更新后,他的特征向量也要跟着变化。如果先更新 MySQL 再写张量库,中间进程崩溃,两边就产生了不一致。
目前业界比较实用的做法是“业务数据库为事实源,异步同步特征库”。具体来说,在 MySQL 里加一个同步状态字段,比如 feature_sync_status,业务事务内更新资料并标记待同步,后台任务扫描未同步的记录,重新编码并写入向量库,完成后更新状态。或者走消息队列,把更新事件发给向量库消费。向量特征的更新通常允许秒级延迟,没必要做成分布式强事务,但要不丢、可重放。这套机制虽然简单,但能解决绝大部分脏数据问题。
4.4 选型时的三个认知误区
第一个误区是“张量数据库就是万能的数据库”。它擅长存向量、查相似,但你要让它存订单、跑事务,只会自找麻烦。第二个误区是“关系型数据库已经过时”。它依然是业务系统的基石,哪怕 AI 应用越来越多,业务元数据、权限、日志、审计仍然需要关系模型。第三个误区是“两者必须二选一”。成熟的架构几乎都是混合使用,关键数据进关系型库,特征向量进张量库,中间用业务 id 关联。想清楚这三点,选型时就不会被新名词带节奏。
5. 从实际项目出发的几点体会
5.1 技术选型的底层逻辑是数据用途,不是概念热度
做了一个又一个项目,我的体感就是:关系型数据库和张量数据库不是竞争关系,而是分工关系。前者是数字世界的骨架,保证业务事实一丝不苟;后者是智能应用的触角,帮助模型在海量特征中找到最像的那一个。项目里最聪明的做法,从来不是鼓吹某个技术有多先进,而是把合适的数据放进合适的存储里。遇到来问选型建议的人,我都会反过来问一句:你的数据是要用来“确认事实”还是“找相似”?这个问题答清楚了,选型就完成了一大半。
5.2 下一步值得尝试的方向
如果你对张量数据库有兴趣,后续可以做两件事。一是把当前流行的几个开源张量数据库在真实业务数据集上做个对比测试,记录索引构建时间、查询延迟、召回率,不要只看官方宣传,自己跑出来的数据才可信。二是研究一下关系型数据库自带的向量插件,比如 PostgreSQL 的 pgvector,在数据量千万级以下时,它可以在不引入独立组件的情况下完成基础向量检索,对小团队来说性价比很高。技术选型没有标准答案,但方向对了,后面的路会顺很多。
