七万号·数据平台实战手记

Back

① 标题党#

主标题Doris 凭什么敢对 Count(*) 说:一秒给你算完? 备选A同样是 Count(*),为什么 Doris 快,MySQL 就歇菜? 备选B(短视频)Doris:论查数,我不是针对谁

② 开场钩子(30 秒)#

你有没有想过——同样是 SELECT count(*) FROM 一张一亿行的表,MySQL 要跑几十秒,Doris 却一秒内搞定。它凭什么?是魔法,还是它查数时……偷偷干了什么?

③ 主角特性:列式存储 + Rollup 预聚合#

今天只讲一个点:Doris 的 COUNT 为什么快——列式存储 + 前缀聚合。

反常识现象:MySQL 的 count(*)逐行扫整张表数一遍,一亿行 = 一亿次累加。

Doris 干了两件事:

  1. 列式存储:数据一列一列排,count(*) 只需知道”有几行”,不碰无关列。MySQL 行式,整行挤一起,查个数也得读全行。
  2. Rollup 预聚合(真·魔法):把 count 结果提前算好存起来

④ 最小可复现#

-- 原表
CREATE TABLE orders (...);

-- 提前算好 count 的 Rollup
ALTER TABLE orders ADD ROLLUP r1 (city, count(*));

-- 查询命中 Rollup,直接取预聚合结果
SELECT city, count(*) FROM orders GROUP BY city;
sql

命中 Rollup 后,查询从”扫全表”变成”读一行预聚合”,几十到几百倍差距。

⑤ 结论#

Doris 的 Count 快,不是它算得快,是它早就算好了——列存储省读取,Rollup 省重算。它把功夫下在你看不见的地方。

⑥ 配图脚本#

画面文案
1黑底金字大标题Doris 凭啥 1 秒查完 Count?
2左右对比:逐行扫 vs 列式行式 vs 列式
3Rollup 预聚合小卡片Rollup = 提前算好
4代码特写ADD ROLLUP
5金句卡功夫在你看不见的地方

Count(*) 一秒算完的秘密
https://realcpf.tech/blog/doris-01
Author 刘佳成
Published at 2026年9月1日