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;