ClickHouse 与 Doris 数据库技术梳理:看懂分析型数据库

这组笔记来自一系列数据库对比与 Doris 专题课程,内容横跨 MySQL、ClickHouse、Hive、Spark SQL 以及 Doris 的核心概念。

一、先分清两类数据库:OLTP 与 OLAP

选数据库的第一步,是搞清楚它"为谁服务"。按业务用途,数据库大致分两类:

|--------------|-------------|-------------------|------------------|
| 类型 | 干啥用的 | 特点 | 代表 |
| OLTP(联机事务处理) | 日常业务操作:增删改查 | 强调实时性、事务一致性、点查询快 | MySQL |
| OLAP(联机分析处理) | 数据分析与报表 | 擅长海量数据的聚合、关联、统计查询 | ClickHouse、Doris |

  • 一句话:OLTP 管"记账"(一笔笔交易),OLAP 管"算账"(看完整体得出趋势)。
  • 为什么会有这种分工?因为"支持事务、实时改一行"和"扫几亿行做统计"是两种对立的优化方向,一个数据库很难两头都做到极致。

二、MySQL 与 ClickHouse:同样的查询,性能差在哪

1. MySQL 的强项与短板

  • 强项:支持事务,适合实时更新和小范围的点查询(按主键查一条)。
  • 短板:一旦面对大规模数据集的聚合查询、多表关联,性能会急剧下降------它本就不是为"扫全表算统计"设计的。

2. ClickHouse 为什么快

  • 专为分析设计,底层是列式存储:同列数据紧挨着放,压缩率高,查询时只读取需要的列。
  • 在聚合查询、海量数据扫描这类"分析型"场景上,速度大幅领先 MySQL。

(关于数据导入:ClickHouse 支持通过文件 + SQL 语句把外部数据装入表中------这是它的"数据入口"机制,具体怎么拷文件、赋权限属于操作细节,本文略去,只记住"它能从文件/外部源装载数据"即可。)

三、ClickHouse 的查询优化:索引与布隆过滤器

1. 非排序键索引

建表时可以针对某些字段额外建索引,加速对这些字段的查询------即使它们不是排序键,也能减少无谓的数据扫描。

2. 布隆过滤器(Bloom Filter)

  • 它是一种"概率型"索引:用很小的空间快速判断"某个元素是否可能存在"。
  • 好处是能迅速排除"肯定不存在"的数据块,从而跳过大量不相关的扫描,加速查询。
  • 代价是它可能误判"存在"(但不会误判"不存在"),属于用极小误差换大幅提速的取舍。

3. ClickHouse 的优劣小结

|--------|-------------------------|
| 维度 | 表现 |
| 优势 | 列式存储 + 高效压缩,大规模分析极具优势 |
| 劣势 | 不支持复杂表关联、不支持事务、无法实时更新数据 |

四、三大分析引擎横向对比:Doris / ClickHouse / Hive(附 Spark SQL)

课程里把几个主流分析引擎放到一起比了性能,结论值得记下来:

|------------|-------------------------------------------|--------------------------|
| 引擎 | 核心特点 / 性能表现 | 短板或注意点 |
| ClickHouse | 分析性能强,单表查询极快 | 不支持事务、关联、实时更新 |
| Doris | 单表查询略慢于 CK;建索引后分桶键查询可达毫秒级;支持三种数据模型 | 大规模关联(非分桶键)易内存溢出;不支持实时更新 |
| Hive | 底层基于 MapReduce;用 Parquet/ORC 远快于 TextFile | 整体慢,但关联查询更稳、能保证任务完成 |
| Spark SQL | 调 Executor 数量/内存可显著提速;ORC 远快于 TextFile | 数据量大时缓存易因内存不足失败,有风险 |

  • 贯穿规律:无论哪个引擎,"列式文件格式(ORC/Parquet)+ 合理索引/分区"都是提速的关键。
  • 一个务实提醒:缓存(cache)能加速,但它依赖充足内存,数据量大、内存不够时反而会成为负担。

五、Doris 核心概念:行/列、Key/Value、三大模型

1. 行与列

  • 一行 = 一条业务记录;一列 = 一个字段(属性)。这是所有表都有的基本单位。

2. Key 与 Value

  • Key 列(维度列):用来"分组、定位"的,比如用户 ID、日期。
  • Value 列(指标/属性列):被统计或展示的内容,比如金额、状态。

3. 三大数据模型(Doris 的核心,其余大多是它的延伸)

|-----------------|--------------------------------|--------------------|
| 模型 | 干什么用 | 典型场景 |
| 明细模型(Duplicate) | 原样保存完整记录,不聚合 | 日志、行为流水,需保留全量历史 |
| 去重/更新模型(Unique) | 按 Key 去重,新数据覆盖旧数据 | 订单状态、用户画像同步等需更新的业务 |
| 聚合模型(Aggregate) | 相同 Key 的多行自动聚合(sum/max/min...) | 指标汇总、预聚合,省空间又提速 |

六、Doris 的分区分桶、分片与副本

一张 Doris 表由几个层次的概念构成,由大到小:

1. 分区(Partition)------ 第一层划分

  • 按"范围"或"枚举"把数据切块,是数据生命周期管理(比如按天清理旧数据)的基本单位。
  • Range 分区:按连续区间(如日期、地区)划分,适合时间/连续数据。
  • List 分区:按离散的枚举值(如固定几个类别)划分,适合分类数据。

2. 分桶(Distribution)------ 第二层划分

  • 在分区内部再按哈希(如 user_id 的哈希值)把数据打散到多个桶,让数据分布更均衡、并行度更高。
  • 关键点:Doris 表必须定义分桶;而分区可以省略(默认会建一个分桶)。分桶字段必须从 Key 列中选取。

3. 分片与副本

  • 分片(Tablet):数据移动和复制的物理单位,一个分桶对应一个分片。
  • 副本(Replica):分片的备份,用于保证高可用------某节点挂了,副本还能顶上。

关系小结:分区(第一层)→ 分桶(第二层)→ 分片(物理单位)→ 副本(备份)。用户可以增删分区,但通常不能直接增删分桶。

七、Doris 建表的核心要素

建一张 Doris 表,围绕下面几件事展开:

  • 引擎类型:默认 OLAP 引擎(即分析型,列存)。
  • 分区(PARTITION):支持 Range(日期)和 List(枚举值)两种划分方式。
  • 分桶(DISTRIBUTION):指定分桶方式(如 Hash)与桶的数量。
  • 属性(PROPERTIES):设置表级参数,典型如副本数(replication)。
  • 数据类型:整数、浮点、日期、时间、字符串(CHAR/VARCHAR);还有特殊类型------HLL(近似去重)、Bitmap(精确去重)。

CREATE TABLE IF NOT EXISTS example_tbl_duplicate

(

log_time DATETIME NOT NULL,

log_type INT NOT NULL,

error_code INT,

error_msg VARCHAR(1024),

op_id BIGINT,

op_time DATETIME

)

DUPLICATE KEY(log_time, log_type, error_code) -- 排序键(前缀索引),数据在写入doris时会按照排序键进行排序,这是 Doris 的明细模型(Duplicate Key)

DISTRIBUTED BY HASH(log_type) BUCKETS 10-- 分桶,分桶数尽量大于节点数

PROPERTIES (

"replication_num" = "1"

); --属性:表示只保存 1 份数据

八、聚合模型的细节:Key/Value 与"分区空洞"

  • 在聚合模型里,Key 列上的聚合函数(sum、max、min、replace 等)会作用到 Value 列上,相同 Key 的多行被合并成一行。
  • 删除一个 Range 分区后,会形成写入不连续的"分区空洞";可以通过重新添加该分区来恢复写入连续性。
  • List 分区删除/新增时要保证枚举值唯一,否则同样会产生空洞。

这些细节的意义在于:Doris 的"删除分区"不是简单抹掉,而是留下了管理上的边界,理解它能避免数据写入出错。

九、一个重要的性能提醒:内存与缓存

  • 数据量很大时,如果内存不足,系统可能根本无法加载数据、查询失败。
  • 缓存能让热数据常驻、加速查询,但前提是内存充足;内存不够时硬加缓存,反而会带来风险。

十、一句话总结:怎么选

|--------------------|--------------------|
| 场景 | 优先选 |
| 日常交易、要事务、改一行 | MySQL(OLTP) |
| 纯分析、单表极速、不在意事务 | ClickHouse |
| 既要分析又想要模型灵活、均衡 | Doris(三种模型 + 分区分桶) |
| 已有 Hadoop 生态、要稳不求快 | Hive |
| 迭代式大规模计算、SQL 化 | Spark SQL |

贯穿所有这些数据库的一条主线是:分析场景靠"列式存储 + 压缩 + 索引/分区"提速,而 Doris 的精髓在于用"三大模型 + 分区分桶"把数据组织和查询效率都管起来。记住"OLTP 管记账、OLAP 管算账",以及"Doris 三模型、分区分桶两层切",就抓住了这组笔记的技术主线。

相关推荐
1024奇点1 小时前
【仓颉语言入门 · 第二篇 第 12 课】
开发语言·数据库·ide·mysql·开源
冰暮流星2 小时前
mysql之insert优化
数据库·mysql
海鸥-w2 小时前
数据库冗余字段设计笔记
java·数据库·笔记·oracle
瑞克-桑切斯3 小时前
4、MySQL 索引与事务
数据库·mysql
二宝哥3 小时前
【问题】本地启动springboot项目启动flowable引擎会提示数据库脚本错误,同事本地启动没有报错(MySQL表明大小写敏感参数)
数据库·mysql
John_Hui3 小时前
第 5 篇:Ubuntu 安装 Redis
数据库·redis·缓存
TDengine (老段)3 小时前
TDengine IDMP 十大实用功能(2)
大数据·数据库·chrome·时序数据库·tdengine·idmp·有问有答
Navicat中国3 小时前
Navicat 连接 Redis 数据库
数据库·redis·数据库开发·navicat