ClickHouse入门:表引擎-MergeTree(一)创建方式

本文详细介绍了ClickHouse的MergeTree表引擎的创建方法,包括分区键、排序键、主键和采样规则,以及关键的设置参数如索引粒度、存储策略等。通过实例演示了如何根据业务场景配置这些参数,提升查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言
插件及服务器版本
服务器:ubuntu 16.04
ClickHouse:20.9.3.45

文章目录

简介

这篇文件简单学习下ClickHouse基础的合并树(MergeTree)表引擎的创建方式,关于合并树基础上的如Replacing、Summing、Aggregating引擎,本文暂时不会涉及。MergeTree作为最基础的引擎,提供了主键索引、数据分区、数据副本等基本能力

创建方式

create table db_name.table_nmae(
...
)ENGINE MergeTree()
PARTITION BY  expr
ORDER BY expr
PRIMARY KEY expr
SAMPLE BY expr
SETTING name=values,...
;

参数说明:

  • PARTITION BY
    (选填):分区键,用于指定表数据以何种标准进行分区,分区键可以是单个字段,也可以是多个字段,同时也支持使用列表达式,如果不声明分区键,会统一生成一个名为all的分区,合理使用分区可以有效的减少查询时数据文件的扫描范围
    1、没有分区键时,创建表后的数据目录结构

    create table m_retailitem2(
    	ID   String,
    	...
    )ENGINE MergeTree()
    ORDER BY (CREATIONDATE,MODIFIEDDATE);
    

    在这里插入图片描述
    这里只有一个前缀为all的分区,后边的1和222分别是最小数据块编号和最大数据块编号,7为该分区合并的次数
    2、有一个分区键时,根据日期年月进行分区,将日期字符串“2012-11-23 11:24:40.0”转成“201211”作为分区键

    create table m_retailitem3(
    	ID     String,
    	...
    )ENGINE MergeTree()
    ORDER BY (CREATIONDATE,MODIFIEDDATE)
    PARTITION BY toYYYYMM(toDate(parseDateTimeBestEffortUS(CREATIONDATE)))
    ;
    

    在这里插入图片描述

  • ORDER BY(必填):排序键,用于指定在一个数据片段内,数据以何种标准排序。默认情况下主键与排序键相同,排序键既可以是单列字段,也可以是多列字段(CREATIONDATE,MODIFIEDDATE),当使用多列字段时,在单个数据片段内,数据首先以CREATIONDATE排序,相同CREATIONDATE的数据再按MODIFIEDDATE排序。

  • PRIMARY KEY(选填):主键,声明后会依据主键字段生成1级索引,用于加速查询,默认情况下,主键与排序键相同,所以可以直接用order by代替主键,与其它数据库不同的是ClickHouse的主键允许存在重复数据(ReplacingMergeTree引擎可以去重,后续介绍)

  • SAMPLE BY(选填):采样表达式,用于声明数据以何种标准进行采样。如果使用了此配置项,那么在主键的配置中需要声明同样的表达式,例如:

    	create table m_retailitem4(
    		ID                            UInt64,
    		...
    	)ENGINE MergeTree()
    	ORDER BY (CREATIONDATE,MODIFIEDDATE,intHash32(ID))
    	PARTITION BY toYYYYMM(toDate(parseDateTimeBestEffortUS(CREATIONDATE)))
    	SAMPLE BY intHash32(ID)
    	;
    
  • SETTING:选填 可设置的参数如下
    1、index_granularity:参数索引的粒度,默认值为8192,也就是说MergeTree的索引在默认情况下,每间隔8192行数据才生成一条索引
    2、index_granularity_bytes:该参数设置索引根据数据体量的大小动态划分间隔大小,默认为10M
    3、enable_mixed_granularity_parts:设置是否自适应索引间隔的功能,默认开启
    4、merge_with_ttl_timeout:mergetree的TTL功能(数据的存活时间),可以为某个字段或者某张表设置TTL
    字段级别的TTL:

    	create table m_retailitem6(
    		ID                            UInt64,
    		MODIFIEDDATE DateTime,
    		NUM UInt8 TTL MODIFIEDDATE + INTERVAL 10 SECOND
    	)ENGINE MergeTree()
    	ORDER BY (MODIFIEDDATE,intHash32(ID))
    	SAMPLE BY intHash32(ID)
    	;
    

    表级别TTL:

    	create table m_retailitem7(
    		ID                            UInt64,
    		MODIFIEDDATE DateTime
    	)ENGINE MergeTree()
    	ORDER BY (MODIFIEDDATE,intHash32(ID))
    	TTL MODIFIEDDATE  + INTERVAL 20 DAT
    	;
    

    5、storage_policy:多路径存储策略
    目前的三种存储策略
    默认存储策略
    JBOD策略:多次盘策略
    HOT/COLD策略:冷热存储策略,根据不同的磁盘类型做冷热存储
    备注: storage_policy后续做详细介绍

### ClickHouse 快速入门教程 #### 创建表 为了创建张新表,可以使用 `CREATE TABLE` 语句。此操作允许指定存储引擎以及列定义和其他选项。例如: ```sql CREATE TABLE example_table ( id UInt32, name String, value Float64 ) ENGINE = MergeTree() ORDER BY id; ``` 这段SQL命令会建立个名为 `example_table` 的表格,并设置它的结构和所使用的存储引擎为 `MergeTree()`[^1]。 #### 启动服务 在各个节点上可以通过执行如下指令来启动ClickHouse的服务: ```bash sudo service clickhouse-server start ``` 这步骤对于确保集群中的每个实例都处于运行状态至关重要[^3]。 #### 数据查询与JOIN操作 当涉及到多张表之间的连接时,需要注意的是每张表仅能进行次JOIN操作。然而,通过嵌套SELECT子查询的方式能够实现多次JOIN的效果。另外,利用IN表达式也可以达到类似的目的并且通常具有更好的性能表现。例如: ```sql SELECT t1.id, t1.name FROM table1 AS t1 WHERE t1.uid IN (SELECT uid FROM table2); ``` 对于跨服务器的数据关联,则需采用带有GLOBAL关键字的形式来进行全局范围内的JOIN或IN查找[^5]。 #### 特性和优势 ClickHouse最初由Yandex公司于2016年推出并开源,旨在克服传统关系型数据库面对海量数据分析场景下的效率低下问题。它以其卓越的速度著称,在处理大规模数据集方面表现出色。随着时间推移和技术进步,该平台不仅保持了高性能的特点,还赢得了广泛的认可和支持,成为了大数据生态系统中不可或缺的部分[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值