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 ...