ClickHouse学习
一、ClickHouse概念
ClinkHouse隶属于OLAP(联机分析)的列式数据库,注意是OLAP和列式数据库。其中OLAP的适用场景如下:
OLAP适用场景:
1、大多数是读请求
2、数据总是批量写入
3、不修改历史数据
4、每次都是读取大量的行
5、宽表,也就是一个表有大量的列
6、简单查询
7、处理单个查询需要高吞吐量
与其他列式数据库比如HBase、BigTable的每秒数十万的吞吐能力相比,ClinkHouse拥有更大的每秒几亿行的吞吐能力。
1、ClickHouse的基本特点
优点:
- ClickHouse的纯列式存储(Hbase虽然也是列式数据库但是受限于其他场景的优化,无法有效处理分析查询)
- 查询速度超快,支持秒亿行的吞吐
缺点:
- 缺少完整的Update/Delete(也就是典型的联机分析性数据库)
- 不支持事务
- 不支持高并发:qps建议为100,原因是为了快所以即使一个查询也会占用一半cpu
- 有限支持update/delete
2、ClickHouse的表引擎
表引擎(即表的类型)决定了:
- 数据的存储方式和位置,写到哪里以及从哪里读取数据
- 支持哪些查询以及如何支持。
- 并发数据访问。
- 索引的使用(如果存在)。
- 是否可以执行多线程请求。
- 数据复制参数。
最优的表引擎是:MergeTree
特点:
-
存储的数据按主键排序
这样相当于创建了一个稀疏索引加快数据检索,如果是联合主键,那么先按主键1进行排序再按主键2,以此类推
(这里与mysql这种不同,clickhouse的主键并没有去重的作用)
-
支持数据副本
3、ClickHouse的数据类型
基础:
MySQL | Hive | ClickHouse |
---|---|---|
byte | TINYINT | Int8 |
short | SMALLINT | Int16 |
int | INT | Int32 |
long | BIGINT | Int64 |
varchar | STRING | String |
timestamp | TIMESTAMP | DateTime |
float | FLOAT | Float32 |
double | DOUBLE | Float64 |
boolean | BOOLEAN | - |
注意点:ClickHouse没有boolean类型
高级:
数据类型 | 含义 | 特点 |
---|---|---|
inf | 正无穷大 | 正数/0时获得,分母为0就认为是无穷大 |
nan | 正无穷小 | 0/0时获得,分子分母都为0得到的就是无穷小 |
Enum8 | 枚举TINYINT | 比如:Enum8(‘true’=1,‘false’=0) |
Enum16 | 枚举SMALLINT | 比如:Enum16(‘true’=1,‘false’=0) |
Array(T) | 数组 | 由T类型元素组成的数组 |
tuple() | 元组 | 存进去的数据每个都有自己的数据类型 |
3、基础的操作语句
1、创建表(ClickHouse创建表需要指定表引擎)
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = engine
创建一张像另一张表结构的表
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] [db.]name AS [db2.]name2 [ENGINE = engine]
2、创建视图
CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]name [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT ...
3、查询
select 列1,列2....
from 表名
where
4、插入
不严格插入数据,没有出现的列自动填充为默认值
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
严格插入数据,每一列都必须出现在上面
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT Values (v11, v12, v13), (v21, v22, v23), ...
插入select 得到的数据
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...