- 对数据的操作尽量进行增量更新而非全量更新
- clickhouse处理速度快的前提是占用一半的cpu,所以qps不高(安装时自动检测机器cpu,可以通过配置文件更改) (Mysql单线程获取数据)
clickhouse存储引擎选择:
表引擎分类
MergeTree
-
主要用于海量数据分析,支持所有Clickhouse sql语法,部分功能与MySQL不一致
-
采用类似LSM tree的结构,很多存储层处理逻辑直到Compaction期间才会发生
-
MergeTree
-
主键并无唯一约束,可插入多条相同主键数据
-
可设置 TTL,对数据存活时间进行约束,仅支持时间类型
-
-
ReplacingMergeTree
-
解决MergeTree主键无法去重问题
-
插入多条主键相同数据,compaction前主键未去重,compaction后,主键相同数据被去重
-
注意事项
-
未彻底compaction之前,无法达到主键去重效果
-
分布式场景下,相同主键的数据可能被sharding到不用节点,不同shard主键可能无法去重
-
optimize是后台操作,无法确认执行时间点
-
手动执行optimize海量数据下,耗费大量时间
-
-
适用于数据最终被去重场景,无法保证查询过程中主键不重复
-
-
CollapsingMergeTree
-
要求建表时指定一个sign,后台compaction时将逐渐相同,sign不同的值进行删除
-
每次新增数据时,sign=1,需要删除时,写入一行数据sign= -1
-
由于compaction时机无法预测,查询count()时,需要改写为count(sign); count(col)->count(col*sign)
-
乱序插入时(先插入取消行再插入状态行) --> 数据无法折叠
-
-
VersionedCollapsingMergeTree
-
建表语句新增一列version,用于乱序情况下记录状态行与取消行的关系。
-
主键相同,version相同,sign相反的行,compaction时被删除。
-
-
SummingMergeTree
-
支持对主键进行预先聚合,提升聚合计算性能,将主键相同的多行sum,存储一行数据
-
常常使用mergeTree存储数据明细,summingMergeTree存储聚合结果,用于提升查询效率
-
-
AggregatingMergeTree
-
预先聚合引擎的一种,相较于上一个,可以指定各种聚合函数
-
语法较为复杂,之后进行详细了解
-
Log Family
- 功能相对简单,适用于快速写入小表(1百万行左右),之后快速读取
- 数据被顺序append到磁盘上
- 不支持 delete、update
- 不支持index
- 不支持原子性写
- insert会阻塞select操作
Integrations
- 主要用于讲外部数据导入clickhouse中,或者通过clickhouse操作外部数据
- kafka:将kafka tpic的数据直接导入
- Mysql:将Mysql作为存储引擎,直接ck操作mysql表
- jdbc/odbc:通过指定jdbc、odbc连接串读取数据源
- hdfs:直接读取hdfs特定格式的数据文件
Special
- Memory:数据在内存中,重启数据丢失,适合于数据持久性无要求的一亿一下的小表
- Buffer:为目标表设置内存buffer,buffer触发一定条件后flush到磁盘