ClickHouse 概念整理

什么是ClickHouse?

  • 毛子开源的一个列式存储数据库(DBMS), 主要用于OLAP, 能使用SQL查询实时生成分析数据报告。
  • 可以类比HBase

数据类型

  • 与其他框架比较

    MySQL Hive ClickHouse
    byte TINYINT Int8
    short SMALLINT Int16
    int INT Int32
    long BIGINT Int64
    varchar STRING String
    timestamp TIMESTAMP DateTime
    float FLOAT Float32
    double DOUBLE Float64
    boolean BOOLEAN
  • 整形

    • 固定长度的整形, 包括有符号整型或无符号整型。
    • 整型范围 (-2n-1, 2n-1 -1)
    • 无符号整型范围 (0 ~ 2n -1)
  • 浮点型(不建议用, 有精度损失问题)

    • Float32
    • Float64
  • 布尔型

    • 没有单独的类型来存储布尔值。可以使用 UInt8 类型, 取值限制为 0 或 1。
  • 字符串

    • String
      • 字符串可以是任意长度的。它可以包含任意的字节集, 包含空字节。
    • FixedString(N)
      • 固定长度 N 的字符串, N必须是严格的正自然数。
      • 当服务端读取长度小于 N 的字符串时, 通过在字符串末尾添加空字节来达到 N 字节长度。
      • 当服务端读取长度大鱼 N 的字符串时, 将返回错误消息。
      • 与 String 相比, 极少会使用 FixedString, 因为使用起来不是很方便。
  • 数组

    • Array(T): 由 T 类型元素组成的数组
    • T 可以是任意类型, 包含数组类型(也就是说可以套娃), 但不推荐使用多维数组(不能再MergeTree 表中存储多维数组)。
  • 元组

    • Tuple(T1, T2, ...) 其中每个元素都有单独的类型, 可以类比python 和 Scala 的 Tuple。

表引擎

  • TinyLog

    • 存在磁盘中
    • 不支持索引
    • 没有并发控制(同时读ok, 同时写会造成数据损坏, 同时读写会相互阻塞并报错)
    • 使用场景: 存储小表以及不会改动的数据
  • Memory

    • 内存引擎, 数据以未压缩的原始形式直接保存在内存中, 服务器重启数据就会消失。
    • 读写操作不会相互阻塞
    • 不支持索引
    • 简单查询下有非常高的性能表现(超过10G/s)
    • 应用场景: 测试, 需要非常高的性能, 同时数据量又不太大(上限大约1亿行)的场景
  • Merge

    • 本身不存储数据
    • 可用于同时从任意多个其他的表中读取数据
    • 读是自动并行的, 不支持写入。
    • 读取时, 那些被真正读取的数据的表的索引(如果有的话)会被使用
  • MergeTree(重点)

    • 使用场景: 有海量数据要插入到表中, 需要高效地一批批写入数据片段, 并希望这些数据片段在后台按照一定规则合并。

    • 特点:

      • 数据按主键排序
      • 可以使用分区(如果指定了主键)
      • 支持数据副本
      • 支持数据采集
    • 格式:

      ENGINE=MergeTree() # 指定引擎
      PARTITION BY # 分区键, 要按月分区, 可以使用表达式toYYYYMM(date_column)
      ORDER BY # 表的排序键, 可以是一组列的元组或任意的表达式, 例如: ORDER BY(id, name)。
      PRIMARY KEY # 主键, 需要与排序键字段不同, 默认情况下主键跟排序键相同
      SAMPLE BY # 用于抽样的表达式式。如果要用抽样表达式, 主键中必须包含此表达式
      SETTINGS # 影响MergeTree性能的额外参数:
      (1) index_granularity: 索引粒度, 即索引中相邻【标记】间的数据行数, 默认值: 8192
      (2) use_minimalistic_part_header_in_zookeeper: 数据片段头在Zookeeper中的存储方式。
      (3) min_merge_bytes_to_use_direct_io: 使用直接 I/O 来操作磁盘的合并操作时要求的最小的数据量。
  • ReplacingMergeTree

    • 在MergeTree的基础上, 添加了"处理重复数据"的功能, 该引擎和MergeTree的不同之处在于它会删除有相同主键的重复项。

    • 数据的去重只会在合并的过程中出现

    • 合并会在未知的事件在后台运行, 所以无法预先作出计划。

    • 有一些数据可能仍未必被处理, 因此ReplacingMergeTree适用于在后台清除重复的数据以节省空间, 但是它不保证没有重复的数据出现。

    • 格式:

      ENGINE=ReplacingMergeTree([ver]) # ver: 版本列, 类型为UInt*, Date 或DateTime
      合并的时候, ReplacingMergeTree 从所有具有相同主键的行中选择一行留下, 如果ver列未指定, 选择最后一条。如果ver列已指定, 选择ver值最大的版本
      PARTITION BY
      ORDER BY
      SAMPLE BY
      SETTING name = value,...
  • SummingMergeTree

    • 继承自MergeTree

    • 当合并 SummingMergeTree 表的数据片段时, ClickHouse 会把所有具有相同主键的行合并为一行, 该行包含了被合并的行中具有数值数据类型的列的汇总值。

    • 如果主键的组合方式使得单个兼职对应于大量的行, 则可以显著的减少存储空间并加快数据查询的速度

    • 对于不可加的列, 会取一个最先出现的值。

    • 格式:

      ENGINE = SummingMergeTree([columns]) # column: 包含将要被汇总的列的列名的元组
      PARTITION BY
      ORDER BY
      SAMPLE BY 
      SETTINGs name=value, ...
  • Distrubuted(重点)

    • 分布式引擎, 本身不存储数据, 但可以在多个服务器上进行分布式查询。

    • 读是自动并行的

    • 读取时, 远程服务器表的索引(如果有的话)会被使用

    • 格式

      Distributed(cluster_name, database, table[, sharding_key])
      # 参数: 集群名, 数据库, 表,分片键
上一篇:【ClickHouse内核】MergeTree物理存储之mrk文件解析


下一篇:H264简单知识