简介
ClickHouse是一个用于联机分析(OLAP:Online Analytical Processing)的列式数据库管理系统(DBMS:Database Management System),简称CH , 主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。
ClickHouse是一个完全的列式数据库管理系统,允许在运行时创建表和数据库,加载数据和运行查询,而无需重新配置和重新启动服务器,支持线性扩展,简单方便,高可靠性,容错。它在大数据领域没有走 Hadoop 生态,而是采用 Local attached storage 作为存储,这样整个 IO 可能就没有 Hadoop 那一套的局限。它的系统在生产环境中可以应用到比较大的规模,因为它的线性扩展能力和可靠性保障能够原生支持 shard + replication 这种解决方案。它还提供了一些 SQL 直接接口,有比较丰富的原生 client。另外就是它比较快。
启动
启动click house服务端
service clickhouse-server start/stop
启动click house客户端
clickhouse-client -m --支持换行写
数据库
create database db_name ;
use db_name ; 切换数据库 ;
select currentDatabase() ;
┌─currentDatabase()─┐
│ db_doit19 │
└───────────────────┘
drop database db_doit19 ;
数据类型
Int8 .... Int256
UInt8 UInt256 正数
Float32 Float64(相当于double)
String
Date
DateTime
Log引擎(数据分块记录偏移量)
Log 引擎适用于临时数据,write-once 表以及测试或演示目的。
--创建表
create table `tb_user`(
id String ,
name String ,
age UInt8 ,
birthday Date
)engine = Log;
数据存储在本地的默认位置(/var/lib/clickhouse/data/default/tb_user)
- 数据是以列为文件存储
- 插入数据的时候是向文件后面追加数据
- xx.bin 列数据
- size.json每个文件的大小
- 不支持索引
- 读写分离
--插入数据
insert into tb_user values('uid0002','wanggang',21,'1999-03-08');
insert into tb_user select * from tb_user ;
┌─id──────┬─name─────┬─age─┬───birthday─┐
│ uid0002 │ wanggang │ 21 │ 1999-03-08 │
└─────────┴──────────┴─────┴────────────┘
┌─id──────┬─name────┬─age─┬───birthday─┐
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
└─────────┴─────────┴─────┴────────────┘
┌─id──────┬─name─────┬─age─┬───birthday─┐
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
│ uid0002 │ wanggang │ 21 │ 1999-03-08 │
└─────────┴──────────┴─────┴────────────┘
表目录
-rw-r-----. 1 clickhouse clickhouse 54 Dec 3 21:58 age.bin
-rw-r-----. 1 clickhouse clickhouse 56 Dec 3 21:58 birthday.bin
-rw-r-----. 1 clickhouse clickhouse 68 Dec 3 21:58 id.bin
-rw-r-----. 1 clickhouse clickhouse 64 Dec 3 21:58 __marks.mrk 数据的块偏移量
-rw-r-----. 1 clickhouse clickhouse 69 Dec 3 21:58 name.bin
-rw-r-----. 1 clickhouse clickhouse 151 Dec 3 21:58 sizes.json -- 长度
__marks.mrk 带标记的文件
标记写在每个数据块上,并且包含偏移量,这些偏移量指示从哪里开始读取文件以便跳过指定的行数。
TinyLog (数据不分块)
这种表引擎的典型用法是 write-once:首先只写入一次数据,然后根据需要多次读取。此引擎适用于相对较小的表(建议最多1,000,000行)。
不能同时读写自己 造成表损坏
表损坏后:
删除表目录
重启服务
删除表
create table tb_user2(
id String ,
name String ,
age UInt8 ,
birthday Date
)engine = TinyLog;
insert into tb_user2 select * from tb_user ;
┌─id──────┬─name─────┬─age─┬───birthday─┐
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
│ uid0002 │ wanggang │ 21 │ 1999-03-08 │
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
│ uid0002 │ wanggang │ 21 │ 1999-03-08 │
└─────────┴──────────┴─────┴────────────┘
┌─id──────┬─name─────┬─age─┬───birthday─┐
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
│ uid0002 │ wanggang │ 21 │ 1999-03-08 │
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
│ uid0002 │ wanggang │ 21 │ 1999-03-08 │
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
│ uid0002 │ wanggang │ 21 │ 1999-03-08 │
│ uid0001 │ wangben │ 27 │ 1994-02-02 │
│ uid0002 │ wanggang │ 21 │ 1999-03-08 │
└─────────┴──────────┴─────┴────────────┘
-rw-r-----. 1 clickhouse clickhouse 88 Dec 3 22:37 age.bin
-rw-r-----. 1 clickhouse clickhouse 98 Dec 3 22:37 birthday.bin
-rw-r-----. 1 clickhouse clickhouse 143 Dec 3 22:37 id.bin
-rw-r-----. 1 clickhouse clickhouse 143 Dec 3 22:37 name.bin
-rw-r-----. 1 clickhouse clickhouse 123 Dec 3 22:37 sizes.json
和Log引擎比较底层数据存储不会分块 没有__marks.mrk文件 不支持索引
StripeLog(数据分块列在一起)
StripeLog 引擎将所有列存储在一个文件中。对每一次 Insert 请求,ClickHouse 将数据块追加在表文件的末尾,逐列写入。
create table tb_user3(
id String ,
name String ,
age UInt8 ,
birthday Date
)engine = StripeLog;
insert into tb_user3 values('001' , '马云',59,'1111-01-02'),('002' , '马化腾',49,'1901-01-02') ;
┌─id──┬─name───┬─age─┬───birthday─┐
│ 001 │ 马云 │ 59 │ 1970-01-01 │
│ 002 │ 马化腾 │ 49 │ 1970-01-01 │
└─────┴────────┴─────┴────────────┘
┌─id──┬─name────┬─age─┬───birthday─┐
│ 001 │ 马liang │ 59 │ 1970-01-01 │
└─────┴─────────┴─────┴────────────┘
┌─id──┬─name───────┬─age─┬───birthday─┐
│ 001 │ 马xiaokang │ 59 │ 1970-01-01 │
│ 002 │ 马kesi │ 49 │ 1970-01-01 │
└─────┴────────────┴─────┴────────────┘
-rw-r-----. 1 clickhouse clickhouse 623 Dec 3 22:43 data.bin — 数据文件。
-rw-r-----. 1 clickhouse clickhouse 285 Dec 3 22:43 index.mrk --带标记的文件。标记包含了已插入的每个数据块中每列的偏移量。
-rw-r-----. 1 clickhouse clickhouse 69 Dec 3 22:43 sizes.json
insert into tb_user3 select * from tb_user ;
总结
共同属性
数据存储在磁盘上。
写入时将数据追加在文件末尾。
不支持突变操作。
不支持索引。这意味着 SELECT
在范围查询时效率不高。
非原子地写入数据。如果某些事情破坏了写操作,例如服务器的异常关闭,你将会得到一张包含了损坏数据的表。
差异
Log 和 StripeLog 引擎支持:
并发访问数据的锁。
INSERT
请求执行过程中表会被锁定,并且其他的读写数据的请求都会等待直到锁定被解除。如果没有写数据的请求,任意数量的读请求都可以并发执行。
并行读取数据。
在读取数据时,ClickHouse 使用多线程。 每个线程处理不同的数据块。
Log 引擎为表中的每一列使用不同的文件。StripeLog 将所有的数据存储在一个文件中。因此 StripeLog 引擎在操作系统中使用更少的描述符,但是 Log 引擎提供更高的读性能。
TinyLog 引擎是该系列中最简单的引擎并且提供了最少的功能和最低的性能。TingLog 引擎不支持并行读取和并发数据访问,并将每一列存储在不同的文件中。它比其余两种支持并行读取的引擎的读取速度更慢,并且使用了和 Log 引擎同样多的描述符。你可以在简单的低负载的情景下使用它。