定义数据表

数据库

创建

CREATE DATABASE if not exists lxl_test_flow_snmp ENGINE = Ordinary;

引擎

ch中数据库也是可以设置引擎的,目前支持5中引擎

  • ordinary:默认引擎,此数据库可以使用任意类型的表引擎
  • dictionary:字典引擎,自动为所有数据字典创建他们的数据表
  • memory:内存引擎,用于存放临时数据,此数据库下的数据表只会停留在内存中,不会涉及任何磁盘操作,当服务重启后数据会被清除
  • lazy:日志引擎,此数据库下只能使用Log系列表引擎
  • MySQL:MySQL引擎,此类数据库下会自动拉取远端MySQL中的数据,并为他们创建MySQL表引擎的数据表

存储

image

  • 在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来让集群的每个节点都执行,免去依次去单个节点执行