Doris的行列存储
Doris是一个高性能、实时的分析型数据库系统,采用多种存储模式以适应不同查询场景。其行列存储的处理策略如下:
1. 列式存储核心优势
针对分析型查询特点,默认采用列式存储:
用户表 (列存储格式) ├── user_id.bin ├── name.dict + .data ├── age.data └── last_login.compressed- 高压缩比:单列数据特征相似(如
age的数值范围),可通过RLE、字典编码等实现高压缩 - 聚合加速:执行
SELECT AVG(age)时仅需读取单列数据 - 延迟物化:
WHERE age > 18筛选后再关联其他列数据
数学表达:
设查询涉及列比例 $ \frac{k}{n} $,行存储扫描成本 $ O(m) $,列存储理论扫描成本 $ O(\frac{k}{n} \times m) $
2. 行存优化点查询
为优化主键查询(如SELECT * FROM users WHERE user_id = 1001),提供行式存储格式:
# 行存储结构示例 Row: user_id: 1001 (4B) name: "张三" (UTF8, 6B) age: 28 (1B) last_login: 1698765432 (4B) # 总行大小 ≈ 15B- 点查优势:通过主键索引直接定位整行数据,减少磁盘随机I/O
- 数据局部性:适合
LIMIT 10等少量行返回场景
3. 自适应存储选择
根据业务场景智能选择:
| 存储类型 | 适用场景 | 示例查询 |
|---|---|---|
| 列存 | 全表扫描/聚合 | SELECT SUM(sales) FROM fact |
| 行存 | 主键查询/小范围扫描 | SELECT * FROM orders WHERE id IN (1001,1002) |
| 混存 | 混合负载 | 时间字段行存 + 指标字段列存 |
最佳实践:
- 时间序列数据:将
timestamp设为行存,数值指标设为列存 - 压缩算法配置:
$$ \text{压缩比} = \frac{\text{原始数据量}}{\text{压缩后数据量}} $$ 对字典字段(如city)启用字典编码,可达 $10:1$ 压缩比
通过灵活存储策略,可在以下场景获得显著性能提升:
-- 列存优势场景:大数据量聚合 SELECT region, SUM(revenue) FROM sales WHERE year = 2023 GROUP BY region; -- 行存优势场景:主键+多列获取 SELECT product_name, price, stock FROM products WHERE product_id = 1005;