Skip to content

Apache Doris 5.0:湖、仓、向量、JSON,凭什么塞进一条 SQL?

先讲一件小事,一件在很多公司每天都在发生、但没人愿意承认的小事。

你问客服机器人:「我上周买的那个东西还能退吗?」它秒回你一段热情洋溢的话,还贴心地附上了商品链接。你点进去——该商品已下架

问题出在哪?模型没坏,SQL 没写错,检索也没超时。真正的原因是:下单状态和库存在 OLAP 里、商品文档在对象存储里、语义检索在向量库里、关键词在 ES 里。这四套系统各有各的更新时间、各有各的版本号、各有各的权限边界。向量库里那件商品的 embedding,是它还在售时算的。于是它被"过期召回",然后大模型非常自信地把一个错误的答案,包装成了一段礼貌的话。

每套系统都解决了一个问题,却把数据一致性、版本对齐、权限治理和结果融合,统统留给了用户。

这句话不是我说的,是 Apache Doris 官方 2026 年 9 月 4 日那篇文章里的原话。而这篇文章抛出来的东西,就是今天的主角——Doris 5.0 的多模湖仓

先把版本说清楚,不然容易被带偏

最近不少媒体写「9 月 4 日 Apache Doris 5.0 发布」。这话不严谨,我得先泼一盆冷水,不然你照着去下载会一脸问号。

截至 2026 年 9 月 10 日,Doris 官网下载页的真实情况是:

版本状态说明
4.1.3Latest当前最新,官方维护分支
4.0.8Stable上一个稳定分支
4.2开发中预计 2026 年 9 月底 GA
5.0开发中预计 2026 年底(官方跟踪单写的是 2026-11)

所以准确的说法是:9 月 4 日发布的是 Doris 5.0 多模湖仓的路线图与能力矩阵,不是一个可以 wget 下来的安装包。这个路线图由社区在 GitHub 上的 #66418 号跟踪单(2026 年 8 月 4 日由 morningman 发起)维护,明确列出了「现在已经支持什么、4.2 支持什么、5.0 支持什么」。

我个人其实更喜欢这种"先把路线图摊开给你看"的做法。数据库这种东西,最怕的不是功能少,而是你按今年的文档做了架构决策,明年它告诉你路线变了。

所以 Apache Doris 到底是个啥

一句话版本:一个基于 MPP 架构的、实时的分析型数据库,兼容 MySQL 协议

它最早是百度搞的(内部叫 Palo,2018 年捐给 Apache),后来被美团、小米、快手、字节这些公司一路"用成了"国产 OLAP 的事实标准之一。官网现在的说法是服务 10,000+ 用户

架构极简,只有两类进程:

  • FE(Frontend):接请求、解析 SQL、管元数据、管节点。生产环境多副本部署,有 Master / Follower / Observer 三种角色。
  • BE(Backend):存数据 + 执行查询,多副本。

部署形态有两个选项:存算一体(shared-nothing,FE/BE 混部,本地磁盘,延迟最低,运维最省事)和存算分离(无状态计算组 + S3/HDFS/OSS 共享存储,弹性伸缩、负载隔离)。官方给的建议很实在:规模可控、想省事就选存算一体;要弹性就选存算分离。

它的硬指标是:查询延迟 < 1 秒、数据导入 秒级、并发 10,000+ QPS、单集群 PB 级

几个真正让它"快"的点

  • 列式存储 + 高压缩比:按列编码压缩,只扫需要的列。针对 10,000+ 列的超宽表做了专门优化。
  • 向量化执行引擎:内存结构全部列式布局,压低虚函数调用、提高 cache 命中、吃满 SIMD 指令。官方口径是宽表聚合场景 5~10 倍提升。
  • MPP 并行:节点间、节点内双层并行,支持大表分布式 Shuffle Join。
  • AQE + Runtime Filter:跑着跑着发现计划不对,动态改。
  • Pipeline 执行引擎:把多核用满,同时限制线程数,避免线程膨胀把自己搞死。
  • 三种存储模型:Duplicate(明细)、Aggregate(预聚合)、Unique(主键,支持行级更新)。
  • 一堆索引:Sorted Compound Key、Min/Max、BloomFilter、倒排索引向量索引

最后这两个索引,是 Doris 这几年从"数仓"往"AI 数据栈"挪的关键。倒排索引管关键词,向量索引管语义召回,再配上 VARIANT 类型(原生吃动态 JSON,配合 Light Schema Change 秒级加字段),混合检索就成了。

5.0 到底要干嘛:四个开放格式,一条 SQL

这是本文的重点。Doris 5.0 的核心思路一句话就能说完:

统一的重点放在查询和执行,而不是要求所有数据进入同一种存储。

也就是说:数据你爱放哪放哪,Iceberg 放长期事实、Paimon 放实时更新、Lance 放 AI 数据集,我 Doris 负责在同一个 SQL 里把它们查明白。

能力矩阵(据 #66418 跟踪单与官方 9 月 4 日文):

数据源现在(≤ 4.1)4.2(2026-09)5.0(2026-11)
Iceberg完整读写:全类型 Catalog、V1/V2、Time Travel、系统表、INSERT/OVERWRITE/CTAS、DELETE/UPDATE/MERGE、分区与 Schema 演进,V3 部分支持(Row Lineage、Deletion Vector)新增 Variant 读写(覆盖 Iceberg V3 的 plain 与 shredded 两种布局)
Paimon只读:Catalog 访问、增量查询、Time Travel、Branch/Tag、系统表、Deletion Vector 读完整 DML(INSERT / UPDATE / DELETE / MERGE / DDL)+ Variant 读写Paimon 索引读取(#65086)
Lance原生读取与检索:Catalog、并行扫描、列裁剪、谓词下推、向量与全文检索、向量索引管理(#66340)
FlussFluss Catalog:日志表、主键表、分层表(Fluss 实时增量 + Paimon 历史 Union Read)(#66399)
ADBCADBC Catalog:通过 ADBC / Arrow Flight SQL 访问外部数据源(#66331)

数据类型层面,Variant / Vector / GEO / Blob 进入统一执行。

翻译成人话,有三个变化最值得你记住:

第一,湖表从"能查"变成"能改"。 Paimon 在 4.1 里只能读,4.2 之后 INSERT、UPDATE、DELETE、MERGE、DDL 全都能写。这意味着你不用再"先落 Doris 内表,再额外建一条同步链路"了。实时业务事件、工具调用参数、模型结果,直接写成开放表资产。

第二,向量和全文检索下沉到湖里。 Lance 在 4.2 里拿到了向量检索和全文检索。以前你要检索多模态数据,得复制到一套专门的索引系统;现在不用了。

第三,实时和历史的边界被抹掉了。 Fluss 的 Union Read 让"刚刚发生的增量"和"分层到 Paimon 的历史"看起来像同一张表。对 Agent 来说,它拿到的上下文既有完整历史,也有刚刚发生的变化——这才是我开头那个"已下架商品"问题的正经解法。

顺带说一句,当前 4.1.3 版本本身也在往前走,几个新东西挺实用:支持 Python UDF/UDAF/UDTF(#63387)、Stream Load 支持 zstd 压缩、湖仓侧给 Iceberg/Hive 的 Parquet/ORC 写入加了 LZ4 压缩

谁在用,以及用出了什么数

讲架构容易空,看数字最实在。以下是官方博客与公开分享里的真实案例。

快手:4 亿+ DAU 的短视频平台,广告数据分析原本是 ClickHouse + Elasticsearch 的混合架构,慢查询率飙到 35%、平均耗时 1.4 秒。换成 Doris 之后:查询性能提升 20%~90%、写入吞吐提升至 3 倍(单表 300 万行/秒)、存储效率提升 60%、慢查询率降到 < 5%、平均问题排查时间降低 80%,水平扩容效率比 ES 高 10 倍以上

更狠的是 A/B 实验那一摊:快手把指标生产从 Spark 迁到 Doris,提速 145 倍,资源消耗下降 72%。顺手还刷新了全球最大单 Doris 集群的纪录——2000 节点、10 万核(2026 年 8 月 12 日官方博客)。

美团:用 Doris 替换掉 Hadoop + Kylin + Druid 的多引擎栈,统一到 300+ 集群、数十 PB 的规模(2026 年 7 月 31 日)。

小米40+ 集群,每天 5000 万次查询,PB 级数据(2026 年 2 月 27 日)。

网易游戏:把 6 套专用系统合并到 Doris,日查询量 1500 万

MiniMax:日志系统从 Grafana Loki 迁到 Doris,PB 级规模、99.9%+ 可用性,10 亿条日志的关键词与聚合查询 2 秒内返回,写入吞吐 10 GB/s,靠 5:1 压缩 + 分层存储把存储成本砍了 70%

腾讯音乐:ES → Doris,整体运维成本降 80%,同一份数据从 697.7 GB 压到 195.4 GB(省 72%),写入快 4 倍,导入时长从 10+ 小时缩短到 3 小时内,告警从每天 20+ 次降到每月个位数。

字节跳动:用 Doris 4.0 的混合检索撑起 10 亿+ 向量的搜索系统。

这几个案例放在一起,能看到一条很清晰的主线:大家都在做减法。不是从 Doris 换到别的,而是从"五六套系统"收敛到"一套"。

初体验:先跑一条 SQL 感受一下

部署这块,站内已经有一篇 《Docker 部署 Doris》 讲得很细,这里不重复。单节点体验版也可以直接用官方镜像 apache/doris 起,具体参数以官方 Quick Start 为准。

起好之后,两件事:

  1. 浏览器打开 http://localhost:8030/ 进 Web UI,用户名 root,密码为空。
  2. 用任意 MySQL 客户端连 9030 端口(Doris 兼容 MySQL 协议,这点对老 DBA 极其友好):
bash
mysql -h 127.0.0.1 -P 9030 -uroot

然后跑一条"混合检索"的 SQL,感受一下 5.0 想做的事:

sql
SELECT id, title, brand, sales_count
FROM products
WHERE category_id = 1                          -- 结构化过滤
  AND body MATCH '透气 轻量'                    -- 全文关键词
  AND match(query_vector, '[0.12, -0.08, ...]') -- 向量语义召回
ORDER BY sales_count DESC
LIMIT 10;

关键词、语义、结构化条件、聚合排序,全在一条 SQL 里。没有跨系统搬运,没有结果拼接,没有"这边的 ID 和那边的 ID 对不上"。

如果你手上有 Lance 数据集,5.0 之后(4.2 起 Lance 可读)还能这么玩:

sql
SELECT episode_id, road_type, weather, model_version, _distance
FROM vector_search(
  "table" = "lance_ai.autodrive.scene_episodes",
  "column" = "scene_embedding",
  "query_vector" = "[0.12, -0.08, 0.31, ...]",
  "top_k" = "200",
  "metric" = "cosine",
  "filter" = "road_type = 'urban' AND event_time >= '2026-08-01'",
  "use_index" = "true"
)
ORDER BY _distance ASC, episode_id;

注意那个 filter——它是检索前过滤:先用业务条件把搜索空间收窄,再生成向量候选。这个顺序很重要,顺序反了,你召回的"相似场景"很可能业务上根本不相关。

几句我的看法

Doris 5.0 这个方向我认同,但有句话得说在前面:"一张表 + 一个引擎搞定一切"是所有数据库厂商都在讲的故事,Snowflake、EDB、DuckDB Labs 今年也都在往同一个方向拐。这种合流说明方向大概率是对的,但不代表你可以无脑上。

我的建议是:如果你现在正被"向量库 + ES + 数仓 + 对象存储"四套系统的一致性折磨,那 4.2 / 5.0 这条线值得盯紧;如果你只是想跑个报表,4.1.3 老老实实用着就行,别为了追新版本把自己坑进去。

另外提醒一句:4.2 和 5.0 都还在开发中,跟踪单里明确写了「Scope may still change before release」。生产环境请等 GA,别拿路线图当排期表。

进阶

本文只是带你从"过期召回"这个现象出发,看清了 Doris 5.0 想解决的问题。想要深入下去,有几个方向值得继续:Iceberg V3 的 Variant 与 Deletion Vector 原理、Paimon 主键表的写入语义、Lance 向量索引的构建与调优,以及 Fluss Union Read 的实时性边界。

更多开源技术干货和学习资料,关注公众号「遇码」,领取专属福利。

遇码MeetCoding 开源技术社区