> 文章列表 > 2023-04-17 mysql列存储-聚合处理-第三阶段-概要设计

2023-04-17 mysql列存储-聚合处理-第三阶段-概要设计

2023-04-17 mysql列存储-聚合处理-第三阶段-概要设计

摘要:

对于聚合的处理, mysql列存储引擎性能十分低下,并且会引发内存OOM.

在第二阶段的聚合处理为了使用旧有的数据流方式, 做了一些错误的多线程并行分割的设计。

现在开启第三阶段的聚合, 以正确的数据流来实现聚合的物化模型。

需求分析:

功能需求:

  1. 加速聚合处理, 性能提升以经典的物化模型为基准
  2. 开启第三阶段的聚合处理后, 与不开启时, 执行结果前后保持一致
  3. 不保证与innodb的结果一致, 仅加速聚合,不处理此前的错误的聚合结果

性能需求:

  1. 性能基准以clickhouse为对象, 而非以innodb为对象
  2. 内存占用不会OOM

设计思想:

  1. 以物化模型处理磁盘IO, RAM, cpu cache, cpu pipeline
  2. 不拘泥现有的存储模型, 为了加快查询速度, 在原有的顺序存储的列数据之外, 添加新的辅助的列数据
  3. 不拘泥于现有的列存储数据的访问方式, 为了正确的物化, 直接从辅助的列数据中组织数据流的访问方式

列数据存储:

  1. 分出定长存储的列与变长存储的列
  2. 定长存储的列, 直接以 列[行号]->值, 以数组的方式进行存储, 可直接通过行号访问到数据
  3. 变长存储分为两个辅助列文件, 辅助列定位文件,辅助列数据文件
    1. 辅助列数据文件:
      1. 存储变长数据, 如字符串
      2. 存储时进行去重
    2. 辅助列定位文件: 
      1. 内部存储在列数据文件中的偏移量
      2. 定长存储, 列[行号] -> 在数据文件的偏移量, 直接通过行号访