ClickHouse

特征

列式存储

  • 可以读取很快

数据压缩

  • 基于列式存储的特征,数据都是特征相似连续存储的,因此可以使得压缩去重效果较好,从而减少数据传输的IO开销

向量化执行

  • 支持CPU寄存器层面的并行,向量化执行简单理解就是基于CPU指令集的并行执行,实现单条指令来操作多条数据,通过SSE4.2指令集实现向量化执行

多线程与分布式

  • 1、数据表有分区的概念,因此可以基于分区做并行操作
    2、纵向扩展:一份数据可以分成不同的分片存储在不同的机器上,可实现数据的分布式存储扩展与并行计算。
    3、横向扩展:支持数据存储副本,由此保证数据高可用

多主架构模型

  • 模型简单,所以会少很多主从协调的复杂问题,天生具备解决单点故障的能力

多样的表引擎

  • 有许多的表引擎,来完成多样化的需求,表引擎是CH许多功能的入口,特别是MegerTree引擎体系,是支持CH功能最全面的表引擎

适用场景

OLAP

  • 多查少改,面向分析

数据类型

基础类型

  • Int
  • Int8
  • Int16
  • Int32
  • float
  • decimal
  • String
  • FixedString
  • UUID
  • Date类型
  • Date
  • DateTime
  • DateTime64
  • Nullable类型
  • 与其他基础类型搭配使用
  • 枚举类型
  • 布尔类型
  • 不支持,可通过枚举变相支持
  • Domain
  • 主要是用于IPV4和IPV6专门的存储格式,可以对插入值进行基于IP的校验

数组类型

  • 多元素类型,每个元素的数据类型必须一样

Tuple

  • 多元素类型,每个元素的数据类型可以不一样

嵌套类型

  • 只支持一层嵌套,内层实际存储类型也是数组类型

数据库引擎

默认类型

mysql类型

  • 套一层壳子,使用CH语法查询MYSQL

表引擎

Log

  • TinyLog
  • 不支持并发操作,写阻塞读。每个列单独存储文件
  • StripeLog
  • 支持并发操作,所有列都写在一个文件,写时会生成块,有记录数据的偏移量,从而可以实现并发操作
  • Log
  • Log系列效率最高的,结合前两者优点,支持并发操作,列字段分别存储文件
  • 适用场景
  • 数据量少,中间数据存储可以使用

Special

  • Memory
  • 内存放置,数据无压缩,很快,但数据不持久化,下次重启数据消失
  • Merge
  • 本身就是一个映射的虚拟表,本身不存储数据,通过通配符将匹配到的表名进行(merge表本身与映射的表字段结构需要一致)合并数据,返回数据结果,本质也算是一个代理查询的作用
  • Distributed
  • CH实现分布式数据操作的关键,与Merge类型,也是相当于一个虚拟的映射表,但是可以通过直接操作该表,从而将数据打散到不同的分区机器上,或者从不同的机器上查询对应的分片数据

MergeTree

  • MegeTree
  • 特征
  • CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
    (
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],

    INDEX index_name1 expr1 TYPE type1(…) GRANULARITY value1,
    INDEX index_name2 expr2 TYPE type2(…) GRANULARITY value2
    ) ENGINE = MergeTree()
    ORDER BY expr
    [PARTITION BY expr]
    [PRIMARY KEY expr]
    [SAMPLE BY expr]
    [TTL expr [DELETE|TO DISK ‘xxx’|TO VOLUME ‘xxx’], …]
    [SETTINGS name=value, …]
  • 分块定期合并
  • 数据写入时会生成数据块片段,后台会定期合并这些块文件
  • 可分区
  • partition by 字段
    可实现对表数据的分区存储
  • 支持副本高可用
  • 排序
  • order by(字段1,字段2…)
    注意:排序的字段才是作为数据块合并时,判断两条数据重复的依据
  • 主键
  • 如果没有指定,则取order by的字段(通用方式),如果指定了,那要保证order by的前缀是主键。
    注意:主键只作为稀疏索引提高查询速度使用,不能进行数据去重
  • 采样
  • 可以对数据进行采样
    注意:如果指定了采样字段,则主键字段必须包含采样字段
  • TTL
  • 可以对数据设置过期时间
  • 合并时的行为
  • MergeTree的本质就是在对数据块合并时进行一些操作的特征引擎,作为base类MergeTree来说,没有进行任何操作
    注意:后续其他MergeTree的合并操作只能针对同一分区内的数据块进行合并操作
  • ReplacingMergeTree
  • 合并时的行为
  • 把order by字段相同的数据进行去重,根据设置,只保留一条数据
  • SummingMergeTree
  • 合并时的行为
  • 将order by字段相同的数据,某些字段进行累加
  • AggregatingMergeTree
  • 合并行为
  • 将order by字段相同的数据,某些字段进行更复杂的一些聚合操作(包括sum)
  • 使用
  • 定义字段
  • create table t_aggregating_mt(
    id UInt8,
    name String,
    age UInt8,
    loc String,
    dept String,
    workdays UInt8,
    salary AggregateFunction(sum,Decimal32(2))
    ) engine = AggregatingMergeTree()
    order by (id,age)
    primary key id
    partition by loc;
  • 插入
  • insert into t_aggregating_mt select 1,‘张三’,18,‘北京’,‘java’,18,sumState(toDecimal32(10000,2));
  • 查询
  • select * ,sumMerge(salary) from t_aggregating_mt group by id,name ,age, loc,dept,workdays,salary ;
  • 结合物化视图
  • 插入使用sumState,查询使用sumMerge,比较麻烦,一般结合物化视图进行使用,从而可以实现自动后台块merge,加快查询效率
  • CollapsingMergeTree
  • 合并行为
  • CH可以支持删除数据的引擎,通过以增代删的方,通过指定标识字段(1为正常,-1为删除),新增删除标识-1的数据,然后匹配合并两条数据,从而实现删除; 但对操作的顺序有强要求,不适合并发操作
  • VersionedCollapsingMergeTree
  • 合并行为
  • CollapsingMergeTree的改良版本,通过版本号来完成数据的删除,不强依赖操作顺序,只需要比对版本号一致来完成匹配即可
  • 副本
  • Replicated+ 以上任意一个Tree,可形成带有副本功能的引擎结构,CH高可用的关键所在!

Integration

  • HDFS
  • MYSQL
  • KAFKA
  • 一般搭配物化视图使用
  • 适用场景
  • 与第三方数据源建立连接映射,通过CH语法完成对第三方数据源查询、插入的操作(不能删除、更新)

视图

  • 普通视图
  • 虚拟的视图,只是把查询语句进行了封装,实际查询时还是去调用源表
  • 物化视图
  • 其实和一张普通表差不多,会进行存储数据,数据来源是某张表的部分查询结果,而这个内容也会随着源表的内容变动而发生动态同步变动