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语法完成对第三方数据源查询、插入的操作(不能删除、更新)
视图
- 普通视图
- 虚拟的视图,只是把查询语句进行了封装,实际查询时还是去调用源表
- 物化视图
- 其实和一张普通表差不多,会进行存储数据,数据来源是某张表的部分查询结果,而这个内容也会随着源表的内容变动而发生动态同步变动