clickhouse -- 三、表结构
定义数据表
数据库
创建
CREATE DATABASE if not exists lxl_test_flow_snmp ENGINE = Ordinary;
引擎
ch中数据库也是可以设置引擎的,目前支持5中引擎
- ordinary:默认引擎,此数据库可以使用任意类型的表引擎
- dictionary:字典引擎,自动为所有数据字典创建他们的数据表
- memory:内存引擎,用于存放临时数据,此数据库下的数据表只会停留在内存中,不会涉及任何磁盘操作,当服务重启后数据会被清除
- lazy:日志引擎,此数据库下只能使用Log系列表引擎
- MySQL:MySQL引擎,此类数据库下会自动拉取远端MySQL中的数据,并为他们创建MySQL表引擎的数据表
存储

- 在data目录下创建对应的文件目录
- 在metadata下创建用于数据库恢复的xx.sql文件
数据表
本地表
CREATE TABLE lxl_test_flow_snmp.flow_data_local_new ON CLUSTER clickhouse_remote_servers
(
`pipe_id` String,
`time` DateTime,
`in_flow` Float64,
`out_flow` Float64,
`in_bps` Float64,
`out_bps` Float64
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/flow_data_local_new', '{replica}')
PARTITION BY toYYYYMM(time)
ORDER BY (pipe_id, time)
SETTINGS index_granularity = 8192
- 通过
ON CLUSTER来指定集群 - ReplicatedMergeTree引擎用来做副本自动同步,里面的参数{shard}是指分片编号取的配置文件中信息,replica则是取的副本信息,这样配置该表就会在集群中的各个节点上创建,不用一个个去创建
- 分区的话CH做得比较好的就是按日期来分区,对字符的分区无法指定分区数量不太好用,除非自己创建一个字段专门用来分区,在业务侧为这个字段定义好分区信息;且分区只有MergeTree系列的表引擎才支持
- 索引结构后面再详细研究,大体上是在磁盘上进行线性存储
分布式表
CREATE TABLE lxl_test_flow_snmp.flow_data_all ON CLUSTER clickhouse_remote_servers as lxl_test_flow_snmp.flow_data_local_new
ENGINE = Distributed('clickhouse_remote_servers', 'lxl_test_flow_snmp', 'flow_data_local_new', rand())
- 一般用all来进行命名,指定好对应的本地表即可
- 最后的
rand()是指通过分布式表进行数据插入的时候,会通过一个随机函数对数据存储的分片进行选择
临时表
也就是之前说的有个数据库引擎只支持临时表,数据在内存中不会落盘,临时表和普通表名可以相同,且临时表的优先级更高,都可以看做一个缓存机制,这个用户通常不会用到,是CH内部数据在集群建传播的载体
视图
有普通和物化视图两种
- 普通视图就是封装的查询语句,帮助获得更清晰的逻辑,但是对性能没有优化作用
- 物化视图是真的会存储到磁盘,视图初始化的时候可以选择同步映射字段中的数据,也可以选择同步之后新入的数据,物化视图不支持同步删除,源字段发生数据删除物化视图中数据仍会保留
分区
分区支持的操作:创建、复制、重置数据、卸载与装载
分布式DDL
在DDL中加入ON CLUSTER来让集群的每个节点都执行,免去依次去单个节点执行
