ClickHouse简介
ClickHouse是一个高性能且开源的数据库管理系统,主要用于在线分析处理(OLAP)业务。它采用列式存储结构,可使用SQL语句实时生成数据分析报告,另外它还支持索引,分布式查询以及近似计算等特性,凭借其优异的表现,ClickHouse在各大互联网公司均有广泛地应用。
ClickHouse 是俄罗斯的 Yandex 于 2016 年开源的用于在线分析处理查询(OLAP :Online Analytical Processing)MPP架构的列式存储数据库(DBMS:Database Management System),能够使用 SQL 查询实时生成分析数据报告。ClickHouse的全称是Click Stream,Data WareHouse。
- ClickHouse可以做用户行为分析,流批一体
- 线性扩展和可靠性保障能够原生支持 shard + replication
- ClickHouse没有走hadoop生态,采用 Local attached storage 作为存储
官网:https://clickhouse.com/
中文官网:
https://clickhouse.com/docs/zh
一、ClickHouse特性
相比于其它的列式数据库,ClickHouse的以下特性决定了它更适用于OLAP业务场景
- 数据压缩:ClickHouse会自动对插入的数据进行压缩,这对于性能的提升起到了至关重要的作用
- 磁盘存储:ClickHouse被设计为工作在传统磁盘上,这意味着数据存储的成本较低
- 多核心并行处理:ClickHouse会利用服务器的一切必要资源,以并行化处理大规模查询
- 分布式查询:在ClickHouse中,数据可以保存在不同的分片(shard)上,查询可以在所有分片上并行处理
- 支持SQL:ClickHouse的查询语言大部分情况下是与SQL标准兼容的
- 向量引擎:ClickHouse采用了列向量引擎技术,可以更为高效地使用CPU资源
- 实时数据更新:ClickHouse使用MergeTree引擎对数据进行增量排序,数据可以持续不断地写入到表中并进行合并,而且在整个过程中不会存在任何加锁行为
- 支持索引:ClickHouse按照排序键对数据进行排序并支持主键索引,可以使其在几十毫秒内完成对特定值或特定范围的查找
- 支持近似计算:ClickHouse提供了许多在允许牺牲数据精度的情况下对查询进行加速的方法 。对于大多数查询而言,ClickHouse的响应速度更快,这也是选择ClickHouse作为OLAP数据处理的主要原因
上面只列举了一些最具代表性的功能,但这已然足以表明为什么 ClickHouse 称得上是 DBMS 了。
但是注意,ClickHouse 虽然很优秀,但它毕竟是一款面向 OLAP 的数据库,我们不能把它用于任何 OLTP 事务性操作的场景,因为它有以下几点不足:
- 不支持事务
- 不擅长根据主键按行粒度进行查询(虽然支持),所以不应该把 ClickHouse 当做键值对数据库使用
- 不擅长按行删除数据(虽然支持)
不过这些不足并不能算是 ClickHouse 的缺点,事实上其它的同类高性能面向 OLAP 的数据库一样不擅长上面这些。因为对于 OLAP 数据库而言,上述这些能力不是重点,只能说这是为了极致的查询性能所做的权衡
二、安装
1.Docker安装
下载地址:
docker-toolbox-mac-docker-for-mac安装包下载_开源镜像站-阿里云
Mac最新Docker.dmg下载地址
https://mirrors.aliyun.com/docker-toolbox/
https://mirrors.aliyun.com/docker-toolbox/mac/docker-for-mac/stable/
2.ClickHouse安装
ClickHouse只能在linux安装 所以在Mac下 我是通过Docker安装的
clickhouse-server 安装
a123456@luludeMBP-2 ~ % docker pull yandex/clickhouse-server
Using default tag: latest
latest: Pulling from yandex/clickhouse-server
ea362f368469: Pull complete
38ba82a23e2b: Pull complete
9b17d04b6c62: Pull complete
5658714e4e8b: Pull complete
6bde977a0bf8: Pull complete
39053b27290b: Pull complete
762d3d237065: Pull complete
Digest: sha256:1cbf75aabe1e2cc9f62d1d9929c318a59ae552e2700e201db985b92a9bcabc6e
Status: Downloaded newer image for yandex/clickhouse-server:latest
docker.io/yandex/clickhouse-server:latest
clickhouse-client 安装
a123456@luludeMBP-2 ~ % docker pull yandex/clickhouse-client
Using default tag: latest
latest: Pulling from yandex/clickhouse-client
2f94e549220a: Pull complete
a72d8599d7c2: Pull complete
e9232762ed9d: Downloading [============================> ] 134.5MB/235MB
29c8f4b1e77e: Download complete
e9232762ed9d: Pull complete
29c8f4b1e77e: Pull complete
Digest: sha256:9ae2ee421c9c9f00406a39a1174276aa23abb7fceac13b40578b18eeaa9bc4d1
Status: Downloaded newer image for yandex/clickhouse-client:latest
docker.io/yandex/clickhouse-client:latest
启动server端
yangyanpingdeMacBook-Air:~ yangyanping$
docker run -d --name ch-server --ulimit nofile=262144:262144 -p 8123:8123 -p 9000:9000 -p 9009:9009 yandex/clickhouse-server
9a8fd6ba268fb6567af1f5a92d9a93467d89411ebae195a5ccc1e88a7cbbcca7
启动 clickhouse-client
a123456@luludeMBP-2 ~ % docker run -it --rm --link ch-server:clickhouse-server yandex/clickhouse-client --host clickhouse-server
ClickHouse client version 22.1.3.7 (official build).
Connecting to clickhouse-server:9000 as user default.
Connected to ClickHouse server version 22.1.3 revision 54455.
三、常用操作
SHOW DATABASES
打印所有的数据库列表,该查询等同于
SELECT name FROM system.databases [INTO OUTFILE filename] [FORMAT format]
SHOW DATABASES [INTO OUTFILE filename] [FORMAT format]
3f070c2bb470 :) show databases;
SHOW DATABASES
Query id: 2aee3be7-688e-4cdb-8663-56baf78d3804
┌─name───────────────┐
│ INFORMATION_SCHEMA │
│ default │
│ information_schema │
│ system │
└────────────────────┘
4 rows in set. Elapsed: 0.005 sec.
创建数据库CREATE DATABASE
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)]
条件
IF NOT EXISTS
如果db_name数据库已经存在,则ClickHouse不会创建新数据库并且:
如果指定了子句,则不会引发异常。
如果未指定子句,则抛出异常。
3f070c2bb470 :) create database test;
CREATE DATABASE test
Query id: 1e43891b-62f3-452c-9662-ca96dac074fd
Ok.
0 rows in set. Elapsed: 0.005 sec.
查询表ENGINE
3f070c2bb470 :) show create database test;
SHOW CREATE DATABASE test
Query id: fd1214aa-f3fd-4817-b818-f73a3bd7a2ec
┌─statement───────────────────────────┐
│ CREATE DATABASE test
ENGINE = Atomic │
└─────────────────────────────────────┘
1 rows in set. Elapsed: 0.003 sec.
切换数据库
3f070c2bb470 :) use test;
USE test
Query id: 338d285e-be47-48b9-878f-187b5094f0e4
Ok.
0 rows in set. Elapsed: 0.002 sec.
创建表
3f070c2bb470 :) CREATE TABLE user
(
`id` Int8,
`name` String,
`age`Int8
) ENGINE = Memory ;
CREATE TABLE user
(
`id` Int8,
`name` String,
`age` Int8
)
ENGINE = Memory
Query id: 832ec5c8-9b3a-48a4-ba70-91b5f21ad68a
Ok.
0 rows in set. Elapsed: 0.013 sec.
查看表结构
3f070c2bb470 :) desc user;
DESCRIBE TABLE user
Query id: aacff6e6-e06f-4753-b299-a1f2212d763e
┌─name─┬─type───┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ id │ Int8 │ │ │ │ │ │
│ name │ String │ │ │ │ │ │
│ age │ Int8 │ │ │ │ │ │
└──────┴────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
3 rows in set. Elapsed: 0.004 sec.
表CRUD操作
3f070c2bb470 :) insert into user(`id`,`name`,`age`) values(1,'yyp',18);
INSERT INTO user (id, name, age) FORMAT Values
Query id: 97bf74fd-b79a-4ad3-a4de-afa6f0c8a3bf
Ok.
1 rows in set. Elapsed: 0.018 sec.
3f070c2bb470 :) select * from user;
SELECT *
FROM user
Query id: 5df46115-378b-4e85-a484-d87937dd4f07
┌─id─┬─name─┬─age─┐
│ 1 │ yyp │ 18 │
└────┴──────┴─────┘
1 rows in set. Elapsed: 0.003 sec.
3f070c2bb470 :) alter table user update age=20 where id =1;
ALTER TABLE user
UPDATE age = 20 WHERE id = 1
Query id: 7cb0f153-ab4b-4003-af97-f8277d09a3c5
Ok.
0 rows in set. Elapsed: 0.008 sec.
3f070c2bb470 :) alter table user delete where id =1;
ALTER TABLE user
DELETE WHERE id = 1
Query id: 66bd95b2-6953-4f44-b95d-9cf63b2caf84
Ok.
0 rows in set. Elapsed: 0.005 sec.
四、表引擎
ClickHouse 并不是直接就一蹴而就的,Metrica 产品的最初架构是基于MySQL实现的,所以在 ClickHouse 的设计中,能够察觉到一些 MySQL 的影子,表引擎的设计就是其中之一。与 MySQL 类似,ClickHouse 也将存储部分进行了抽象,把存储引擎作为一层独立的接口,并且拥有合并树、内存、文件、接口等 20 多种引擎。其中每一种引擎都有着各自的特点,用户可以根据实际业务场景的需求,选择合适的引擎。
下面是几种常用的表引擎:
TinyLog
最简单的表引擎,用于将数据存储在磁盘上。每列都存储在单独的压缩文件中。写入时,数据将附加到文件末尾。
并发数据访问不受任何限制:
如果同时从表中读取并在不同的查询中写入,则读取操作将抛出异常
如果同时写入多个查询中的表,则数据将被破坏。
这种表引擎的典型用法是 write-once:首先只写入一次数据,然后根据需要多次读取。查询在单个流中执行。换句话说,此引擎适用于相对较小的表(建议最多1,000,000行)。如果您有许多小表,则使用此表引擎是适合的,因为它比Log引擎更简单(需要打开的文件更少)。当您拥有大量小表时,可能会导致性能低下,但在可能已经在其它 DBMS 时使用过,则您可能会发现切换使用 TinyLog 类型的表更容易。不支持索引。
在 Yandex.Metrica 中,TinyLog 表用于小批量处理的中间数据。
以列文件的形式保存在磁盘上,不支持索引,没有并发控制。一般保存少量数据的小表,生产环境上作用有限。可以用于平时练习测试使用。
Memory
Memory 引擎以未压缩的形式将数据存储在 RAM 中。数据完全以读取时获得的形式存储。换句话说,从这张表中读取是很轻松的。并发数据访问是同步的。锁范围小:读写操作不会相互阻塞。不支持索引。查询是并行化的。在简单查询上达到最大速率(超过10 GB /秒),因为没有磁盘读取,不需要解压缩或反序列化数据。(值得注意的是,在许多情况下,与 MergeTree 引擎的性能几乎一样高)。重新启动服务器时,表中的数据消失,表将变为空。通常,使用此表引擎是不合理的。但是,它可用于测试,以及在相对较少的行(最多约100,000,000)上需要最高性能的查询。
内存引擎,数据以未压缩的原始形式直接保存在内存当中,服务器重启数据就会消失。读写操作不会相互阻塞,不支持索引。简单查询下有非常非常高的性能表现。一般用到它的地方不多,除了用来测试,就是在需要非常高的性能,同时数据量又不太大的场景
MergeTree
Clickhouse 中最强大的表引擎当属 MergeTree (合并树)引擎及该系列(*MergeTree)中的其他引擎。
MergeTree 系列的引擎被设计用于插入极大量的数据到一张表当中。数据可以以数据片段的形式一个接着一个的快速写入,数据片段在后台按照一定的规则进行合并。相比在插入时不断修改(重写)已存储的数据,这种策略会高效很多。
主要特点:
存储的数据按主键排序。
这使得您能够创建一个小型的稀疏索引来加快数据检索。
如果指定了 分区键 的话,可以使用分区。
在相同数据集和相同结果集的情况下 ClickHouse 中某些带分区的操作会比普通操作更快。查询中指定了分区键时 ClickHouse 会自动截取分区数据。这也有效增加了查询性能。
支持数据副本。
ReplicatedMergeTree 系列的表提供了数据副本功能。更多信息,请参阅 数据副本 一节。
支持数据采样。
需要的话,您可以给表设置一个采样方法。
ClickHouse中最强大的表引擎当属MergeTree引擎及该系列中的其他引擎,支持索引和分区,地位可以相当于innodb之于Mysql。而且基于MergeTree,还衍生除了很多小弟,也是非常有特色的引擎。