- 决定表存储在哪里以及以何种方式存储
- 支持哪些查询以及如何支持
- 并发数据访问
- 索引的使用
- 是否可以执行多线程请求
- 数据复制参数
引擎分类 | 引擎名称 |
---|---|
MergeTree系列 | MergeTree 、ReplacingMergeTree 、SummingMergeTree 、 AggregatingMergeTree CollapsingMergeTree 、 VersionedCollapsingMergeTree 、GraphiteMergeTree |
Log系列 | TinyLog 、StripeLog 、Log |
Integration Engines | Kafka 、MySQL、ODBC 、JDBC、HDFS |
Special Engines | Distributed 、MaterializedView、 Dictionary 、Merge 、File、Null 、Set 、Join 、 URL View、Memory 、 Buffer |
Log系列表引擎功能相对简单,主要用于快速写入小表(1百万行左右的表),然后全部读出的场景。即一次写入多次查询。
- 数据存储在磁盘上
- 当写数据时,将数据追加到文件的末尾
- 不支持并发读写,当向表中写入数据时,针对这张表的查询会被阻塞,直至写入动作结束
- 不支持索引
- 不支持原子写:如果某些操作(异常的服务器关闭)中断了写操作,则可能会获得带有损坏数据的表
- 不支持ALTER操作(这些操作会修改表设置或数据,比如delete、update等等)
TinyLog
是Log系列引擎中功能简单、性能较低的引擎。它的存储结构由数据文件和元数据两部分组成。其中,数据文件是按列独立存储的,也就是说每一个列字段都对应一个文件
。除此之外,TinyLog
不支持并发数据读取。
StripLog
支持并发读取数据文件,当读取数据时,ClickHouse
会使用多线程进行读取,每个线程处理一个单独的数据块。另外,StripLog将所有列数据存储在同一个文件中
,减少了文件的使用数量。
Log
支持并发读取数据文件,当读取数据时,ClickHouse
会使用多线程进行读取,每个线程处理一个单独的数据块。Log引擎
会将每个列数据单独存储在一个独立文件中
。
该引擎适用于一次写入,多次读取的场景。对于处理小批数据的中间表可以使用该引擎。值得注意的是,使用大量的小表存储数据,性能会很低。
CREATE TABLE emp_tinylog
(
emp_id UInt16 COMMENT '员工id',
name String COMMENT '员工姓名',
work_place String COMMENT '工作地点',
age UInt8 COMMENT '员工年龄',
depart String COMMENT '部门',
salary Decimal32(2) COMMENT '工资'
) engine = TinyLog();
INSERT INTO emp_tinylog
VALUES (1, 'tom', '上海', 25, '技术部', 20000),
(2, 'jack', '上海', 26, '人事部', 10000);
INSERT INTO emp_tinylog
VALUES (3, 'bob', '北京', 33, '财务部', 50000),
(4, 'tony', '杭州', 28, '销售事部', 50000);
进入默认数据存储目录,查看底层数据存储形式,可以看出:TinyLog引擎表每一列都对应的文件:
[root@mypc01 data]# ll /data/clickhouse/clickhousedata/data/default/emp_tinylog/
总用量 28
-rw-r-----. 1 root root 56 1月 8 19:45 age.bin
-rw-r-----. 1 root root 97 1月 8 19:45 depart.bin
-rw-r-----. 1 root root 60 1月 8 19:45 emp_id.bin
-rw-r-----. 1 root root 70 1月 8 19:45 name.bin
-rw-r-----. 1 root root 68 1月 8 19:45 salary.bin
-rw-r-----. 1 root root 185 1月 8 19:45 sizes.json
-rw-r-----. 1 root root 80 1月 8 19:45 work_place.bin
## 在sizes.json文件内使用JSON格式记录了每个.bin文件内对应的数据大小的信息
## 查看sizes.json数据
[root@mypc ~]# cat /data/clickhouse/clickhousedata/data/default/emp_tinylog/sizes.json
{"yandex":{"age%2Ebin":{"size":"56"},"depart%2Ebin":{"size":"97"},"emp_id%2Ebin":{"size":"60"},"name%2Ebin":{"size":"70"},"salary%2Ebin":{"size":"68"},"work_place%2Ebin":{"size":"80"}}}
当我们执行ALTER
操作时会报错,说明该表引擎不支持ALTER操作
相比TinyLog
而言,StripeLog
拥有更高的查询性能(拥有.mrk标记文件,支持并行查询),同时其使用了更少的文件描述符(所有数据使用同一个文件保存)。
CREATE TABLE emp_striplog
(
emp_id UInt16 COMMENT '员工id',
name String COMMENT '员工姓名',
work_place String COMMENT '工作地点',
age UInt8 COMMENT '员工年龄',
depart String COMMENT '部门',
salary Decimal32(2) COMMENT '工资'
) engine = StripeLog();
INSERT INTO emp_striplog
VALUES (1, 'tom', '上海', 25, '技术部', 20000),
(2, 'jack', '上海', 26, '人事部', 10000);
INSERT INTO emp_striplog
VALUES (3, 'bob', '北京', 33, '财务部', 50000),
(4, 'tony', '杭州', 28, '销售事部', 50000);
select * from emp_striplog;
进入默认数据存储目录,查看底层数据存储形式
[root@mypc01 data]# ll /data/clickhouse/clickhousedata/data/default/emp_striplog/
总用量 12
-rw-r-----. 1 root root 673 1月 8 19:54 data.bin
-rw-r-----. 1 root root 281 1月 8 19:54 index.mrk
-rw-r-----. 1 root root 69 1月 8 19:54 sizes.json
可以看出StripeLog
表引擎对应的存储结构包括三个文件:
同一个文件
保存,它们的数据都会被写入data.bin
。注:
1、
StripeLog
引擎将所有数据都存储在了一个文件中,对于每次的INSERT操作,ClickHouse会将数据块追加到表文件的末尾2、StripeLog引擎同样不支持
ALTER UPDATE
和ALTER DELETE
操作
Log引擎表
适用于临时数据,一次性写入、测试场景。Log引擎结合了TinyLog表引擎和StripeLog表引擎的长处,是Log系列引擎中性能最高的表引擎。
CREATE TABLE emp_log
(
emp_id UInt16 COMMENT '员工id',
name String COMMENT '员工姓名',
work_place String COMMENT '工作地点',
age UInt8 COMMENT '员工年龄',
depart String COMMENT '部门',
salary Decimal32(2) COMMENT '工资'
) engine = Log();
INSERT INTO emp_log
VALUES (1, 'tom', '上海', 25, '技术部', 20000),
(2, 'jack', '上海', 26, '人事部', 10000);
INSERT INTO emp_log
VALUES (3, 'bob', '北京', 33, '财务部', 50000),
(4, 'tony', '杭州', 28, '销售事部', 50000);
进入默认数据存储目录,查看底层数据存储形式
[root@mypc01 ~]# ll /data/clickhouse/clickhousedata/data/default/emp_log/
-rw-r-----. 1 root root 56 1月 8 19:58 age.bin
-rw-r-----. 1 root root 97 1月 8 19:58 depart.bin
-rw-r-----. 1 root root 60 1月 8 19:58 emp_id.bin
-rw-r-----. 1 root root 96 1月 8 19:58 __marks.mrk
-rw-r-----. 1 root root 70 1月 8 19:58 name.bin
-rw-r-----. 1 root root 68 1月 8 19:58 salary.bin
-rw-r-----. 1 root root 215 1月 8 19:58 sizes.json
-rw-r-----. 1 root root 80 1月 8 19:58 work_place.bin
Log引擎的存储结构包含三部分:
按列单独存储
注:
Log表引擎会将每一列都存在一个文件中,对于每一次的INSERT操作,都会对应一个数据块
对于clickhouse
,选择合适的引擎是重要的