① 标题党#
主标题:Doris 凭什么敢对 Count(*) 说:一秒给你算完?
备选A:同样是 Count(*),为什么 Doris 快,MySQL 就歇菜?
备选B(短视频):Doris:论查数,我不是针对谁
② 开场钩子(30 秒)#
你有没有想过——同样是 SELECT count(*) FROM 一张一亿行的表,MySQL 要跑几十秒,Doris 却一秒内搞定。它凭什么?是魔法,还是它查数时……偷偷干了什么?
③ 主角特性:列式存储 + Rollup 预聚合#
今天只讲一个点:Doris 的 COUNT 为什么快——列式存储 + 前缀聚合。
反常识现象:MySQL 的 count(*) 要逐行扫整张表数一遍,一亿行 = 一亿次累加。
Doris 干了两件事:
- 列式存储:数据一列一列排,
count(*)只需知道”有几行”,不碰无关列。MySQL 行式,整行挤一起,查个数也得读全行。 - 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 列式 |
| 3 | Rollup 预聚合小卡片 | Rollup = 提前算好 |
| 4 | 代码特写 | ADD ROLLUP |
| 5 | 金句卡 | 功夫在你看不见的地方 |