MergeTree系列引擎介绍
MergeTree系列引擎是clickhouse中最强大的表引擎
数据按照片段被一批批写入表
数据片段在后台按照一定规则进行合并。
主要特性
- 数据按照 主键排序,稀疏索引快速检索数据
- 数据分区 增加查询性能
- 数据副本 ReplicatedMergeTree系列的引擎支持数据副本,替身查询性能和容错
- 数据采样 设置采样方法,快速分析数据
建表模板
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], ... INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1, INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2 ) ENGINE = MergeTree() [PARTITION BY expr] [ORDER BY expr] [PRIMARY KEY expr] [SAMPLE BY expr] [TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...] [SETTINGS name=value, ...]
建表语句
- ENGINE : 引擎的名称和参数
- PARTITION BY : 分区键
- ORDER BY:表的排序键
- PRIMARY KEY : 表的主键
- SAMPLE BY : 采样表达式
- TTL:定义行数据的存储时间,磁盘和卷之间数据片段的自动移动逻辑。
- SETTINGS : 控制MergeTree行为的额外参数。
MergeTree设置
重要参数:
- index_granularity:索引力度,以行数为单位,表示索引标记(mark)之间的最大数据行数。默认值:8192。
- index_granularity_bytes:索引力度,以字节为单位,表示索引力度的最大子节大小,默认值:10Mb。设置该参数为0,将仅按行数限制索引粒度大小。
- use_minimalistic_part_header_in_zookeeper:数据片段(part)头在Zookeeper中的存储方法。设置为1,紧凑存储数据片段头信息,极大减少Zookeeper的存储数据量。
- storage_policy:存储策略。存储策略定义了使用多块设备进行数据存储的逻辑。
- 更多设置参数:参数列表中其功能参见表system.merge_tree_settings。
MergeTree参数的设置
- 表级:在建表时设置
- 全局:config.xml的merge_tree标签内进行设置。
建表示例
非分区表
CREATE TABLE merge_demo( srcip String, destip String, date_time DateTime ) ENGINE = MergeTree() ORDER BY srcip SETTINGS index_granularity = 8192;
分区表
CREATE TABLE merge_partition_demo( srcip String, destip String, date_time DateTime ) ENGINE = MergeTree() PARTITION BY toYYYYMM(date_time) ORDER BY srcip;
插入数据
insert into merge_demo values ('113.248.234.232','123.212.22.01','2018-07-12 14:35:31'), ('113.248.234.231','123.212.22.02','2018-07-12 14:35:32'), ('113.248.234.233','123.212.22.03','2018-07-12 14:35:33'), ('113.248.234.234','123.212.22.04','2018-07-12 14:35:34'), ('113.248.234.235','123.212.22.05','2018-07-12 14:35:35'), ('113.248.234.236','123.212.22.06','2018-07-12 14:35:36'); insert into merge_partition_demo values ('113.248.234.232','123.212.22.01','2018-07-12 14:35:31'), ('113.248.234.231','123.212.22.02','2018-07-12 14:35:32'), ('113.248.234.233','123.212.22.03','2018-07-12 14:35:33'), ('113.248.234.234','123.212.22.04','2018-07-12 14:35:34'), ('113.248.234.235','123.212.22.05','2018-07-12 14:35:35'), ('113.248.234.236','123.212.22.06','2018-07-12 14:35:36'), ('113.248.234.232','123.212.22.01','2013-07-12 14:35:31'), ('113.248.234.231','123.212.22.02','2013-07-12 14:35:32'), ('113.248.234.233','123.212.22.03','2016-07-12 14:35:33'), ('113.248.234.234','123.212.22.04','2016-07-12 14:35:34'), ('113.248.234.235','123.212.22.05','2019-07-12 14:35:35'), ('113.248.234.236','123.212.22.06','2019-07-12 14:35:36');
查看数据存储
查看非分区表的存储
ll /var/lib/clickhouse/data/test/merge_demo/
这里test是表中数据库名,merge_demo是表名。
查看分区表的存储
ll /var/lib/clickhouse/data/test/merge_partition_demo/
数据的存储
- checksums.txt : 校验文件的正确性和完整性。
- columns.txt : 存储列的信息,包括数据类型。
- count.txt : 存储分区目录下数据的总行数。
- primary.idx : 存储索引数据的文件。稀疏索引,能够加速查询。
- bin文件:存储数据的文件,以研所格式存储,默认LZ4。
- mrk文件:存储列的数据标记的文件。
- partition.dat : 存储存储分区表表达式生成的值。使用二进制格式存储。该文件只在分区表中存储。
- minmax_*文件 : 存储能当前目录下,分区字段对应的原始字段的最小和最大值。
- skp_idx_.idx、skp_idx_.mrk:skip索引标记文件。
数据片段
- 一个表是由按主键排序的数据片段(part)组成
- 当向表中插入数据时,将创建单独的数据片段
- clickhouse在后台合并数据片段以便更高效的存储
- 不会合并来自不同分区的数据片段。
演示
再导入一遍分区数据,查看目录
ll /var/lib/clickhouse/data/test/merge_partition_demo/
在clickhouse中输入手动合并命令
optimize table merge_partition_demo;
再次查看目录多了一个文件夹虽然没有删除还存在的旧文件加,但是已经失效通过查看system.parts表就知道了
select partition,name,active,table from system.parts where table='merge_partition_demo';
可以清楚的看到文件已失效。