ClickHouse

logo

介绍

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 官网介绍特性性能

安装

使用

表引擎

Clickhouse创建本地表的时候需要指定表引擎,类似于mysql可以选择innodb或者myisam,不同的表引擎具有不同特性,发挥不同功能,需要根据具体业务场景选择。

日常业务中使用最多的就是MergeTree系列表引擎,如下:

引擎名称引擎说明场景备注
MergeTree合并树非去重普通场景最基础的引擎,底层类似于LSM的方式,其他引擎都是基于其增加一些特殊特性
ReplacingMergeTree去重合并树需要按主键去重/覆盖更新的场合比较通用的引擎,支持同主键去重,但是去重是后台执行,不可控(实测非常慢)
CollapsingMergeTree折叠树也是为了去重,方式比较独特如果按照主键去重,需要在写入新数据时知道原来的数据方可
VersionedCollapsingMergeTree版本折叠树折叠树基础上加了一些优化折叠树基础上增加了版本的概念,按版本去重
SummingMergeTree求和合并树相同主键的数据合并成一行并对指标自动求和推荐结合MergeTree使用,MergeTree存放详细数据,SummmingMergeTree存储聚合数据
AggregatingMergeTree聚集合并树相同主键的数据合并成一行并对指标自动聚集计算是SummingMergeTree的扩展,不局限于sum而是可以有其他聚合逻辑,常配合物化视图做增量数据的聚合

以上表引擎为单副本情况下,如果使用多副本需要使用Replicated*系列的引擎,这样可以配合zookeeper实现副本数据复制

引擎名称说明
ReplicatedMergeTree与对应的不带Replicated系列的功能一致,只是这种引擎支持副本数据复制
ReplicatedReplacingMergeTree 
ReplicatedCollapsingMergeTree 
ReplicatedVersionedCollapsingMergeTree 
ReplicatedSummingMergeTree 
ReplicatedAggregatingMergeTree 

分布式表引擎:Distributed,用于创建分布式表

库表创建&查询

建库

建表

1、 本地表与分布式表

Clickhouse中的表有本地表分布式表的概念:

本地表指各个分片节点自身的表,在各个分片节点上分别存储各自的数据,在不同的分片节点上查询本地表也只会展示当前节点上的数据;

分布式表需要关联到本地表,本身不存储数据,实际上相当于一张分布式视图,在任意节点查询分布式表,clickhouse会把计算分发到各分片节点,汇总各节点的计算结果后返回全局结果

例如:我们有3个分片节点,有一张本地表t_data_local,共100W数据,那么节点1可能存储30W数据,节点2有20W数据,节点3有50W数据;另外有一张分布式表t_data关联到t_data_local

在节点1上查询select count(*) from t_data_local,数据量为30W;节点2上查询为20W,节点3为50W

而不管在哪个节点查询select count(*) from t_data,均为100W数据

所以查询需要查询分布式表才能获取完整的数据

 

Clickhouse中建表步骤分为两步:1)建立本地表;2)建立分布式表,

2、创建本地表

建议规范:分布式表使用正常的表名,本地表在后面加_local以示区分

3、 创建分布式表

建好本地表后,需要建立分布式表关联本地表

备注:所有的DDL语句务必都加上on cluster 集群名,这样在任意一个节点执行就相当于在集群所有节点执行,不然就需要到每个节点上依次执行一遍这个语句

4、 创建视图

选择性创建视图

常用数据类型

分类常用类型说明备注
整数有符号整数Int8数据范围: -128 ~ 127
Int16数据范围:-32768 ~ 32767  
Int32数据范围: -2147483648 ~ 2147483647  
Int64数据范围: -9223372036854775808 ~ 9223372036854775807  
无符号整数UInt8数据范围: 0 ~ 255,clickhouse中没有0-1布尔类型,用这个类型代替 
UInt16数据范围: 0 ~ 65535  
UInt32数据范围: 0 ~ 4294967295  
UInt64数据范围: 0 ~ 18446744073709551615  
浮点数Float3232位浮点数 
Float6464位浮点数  
定点数Decimal32(S)32位定点数,数据范围: -1 * 10^(9-S) ~ 1 * 10^(9-S) 
Decimal64(S)64位定点数,数据范围: -1 * 10^(18-S) ~ 1 * 10^(18-S)  
字符串不定长String字符串,任意长度
定长FixedString(N)固定长度N的字符串,N为正整数 
日期与时间日期Date日期类型,'2021-01-08',精确到天
时间DateTime日期时间类型,'2021-01-08 13:13:13',精确到秒 
DateTime64(precision, [timezomne])日期时间类型,可指定精度和时区(可选),如DateTime64(3)可表示'2021-01-08 13:13:13.222'  
枚举类型Enum8用法:CREATE TABLE t_test_local( field1 Enum8('hello' = 1, 'world' = 2));field1字段被设置为枚举类型,它只能存储两种值'hello'与'world',插入其他值会报错误 
Enum16同Enum8,只是整数范围为Int16,一般没有必要,Enum8已足够了  
特殊:NullableNullable(数据类型)解释:Clickhouse中的字段类型与Mysql不同,默认来说是不允许为空的(基于性能考虑),会自动赋予个默认值如果需要允许为空的情况出现,可以用Nullable,如下所示CREATE TABLE t_test_local( field1 Nullable(Int32));表示field1字段是Int32类型,但是允许为空 

DDL变更

ALTER语法

需要先在本地表操作,再在分布式表同样操作(所有的表结构变更语句都需要先在本地表执行,然后在分布式表执行,都执行完毕才可以)

DML变更

使用Mutations更改数据

与某些数据库不同,默认情况下,ClickHouse的ALTER UPDATE语句是异步的,这意味着更新操作是发生在后台的,不会立即见效。这个更新表数据的过程被称为Mutations。检查Mutations的执行进度。可以操作MergerTree(及其家族)引擎的表,不能操作分布式表。

其他

集群信息等

 

命令行参数

查看数据库/表

1、查看 Test 数据库的所有表

-- 方法一 select name from system.tables where database = 'Test';

-- 方法二 select distinct table from system.columns where database = 'Test';

2、查看 Test_table 表的所有字段

select name from system.columns where database = 'Test' and table='Test_table';

3、查看 Test_table 表的字段名、字段类型、字段注释

select database,table,name,type,comment from system.columns where database = 'Test' and table='Test_table';

4、若想就看某个表的某一两个字段的字段类型的话,可直接 调用 toTypeName() 函数来查看

select top 1 toTypeName(id),toTypeName(name) from Test_table;

输入多行insert命令

命令行执行sql

导出

注意:如果执行语句后面不加FORMAT CSV或FORMAT CSVWithNames,默认是\t作为分隔符。等同于--format CSV--format CSVWithNames

只有指定FORMAT CSV或FORMAT CSVWithNames后,指定--format_csv_delimiter才生效。

导入

distributed_product_mode

解决方法

执行计划

explain

用于查看执行计划,默认值。

explain syntax

在语法优化后返回查询。

可以使用此语法进行判断sql是否是当前查询方式的最佳性能,可以查看一些sql是会进行谓词下推。

processes

查看当前正在执行的查询任务 SELECT 和 INSERT

当查系统表时,query只会在本地节点运行,如果需要获取cluster上所有的shards或者replicas,需要使用clusterAllReplicas表函数。

mutations

查看当前正在执行的mutation任务 ALTER DELETE 和 ALTER UPDATE

query_log

查看配置:

日志信息存储在表system.query_log中,包含两种查询:

1.客户端执行的查询

2.由其他查询发起的子查询(分布式查询执行)。对于这些类型的查询,有关父查询的信息显示在initial_*列中

 

一个查询会产生一条或两条记录,这个取决于状态(查看type列):

1.执行成功的查询,会生成两条记录,type的值分别是QueryStart和QueryFinish,且query_id一致

event_date/event_time对应事件开始/完成的时间, sql启动时间为query_start_time. QueryFinish类型的event_time,也就是query_end_time.

2.查询执行过程中产生了错误,会生成两个事件,type的值分别是QueryStart和ExceptionWhileProcessing

3.在查询执行之前发生了错误,会生成一个事件,type的值是ExceptionBeforeStart

query_log 解析

慢sql阈值

刚确认过了,这个告警的阈值配置需要在服务参数中设置才能生效,在集群—clickhouse服务—配置—全部配置中,搜索slow关键字,就可以看到一个参数slow_sql_cost_time,默认值180,单位是秒