ClickHouse release 24.1, 2024-01-30
1、创建表
像大多数数据库一样,ClickHouse在逻辑上将表分组到 databases
中。使用CREATE DATABASE
命令在ClickHouse中创建一个新的数据库:
CREATE DATABASE IF NOT EXISTS helloworld
类似地,使用CREATE TABLE
定义一个新表。(如果不指定数据库名称,则表将在default
数据库中。)下面这个表的名字是helloworld
数据库中的my_first_table
:
CREATE TABLE helloworld.my_first_table
(
user_id UInt32,
message String,
timestamp DateTime,
metric Float32
)
ENGINE = MergeTree()
PRIMARY KEY (user_id, timestamp)
在上面的例子中,my_first_table
是一个包含四列的MergeTree
表:
User_id
: 32位无符号整数message
:一个 String数据类型,它取代了其他数据库系统中的VARCHAR、BLOB、CLOB等类型timestamp
: DateTime值,表示时间中的某个瞬间Metric
: 32位浮点数
表引擎确定:
如何以及在哪里存储数据
支持哪些查询
数据是否被复制
有许多引擎可供选择,但对于单节点ClickHouse服务器上的简单表,MergeTree
是您可能的选择。
主键简介
在你进一步深入之前,了解主键在ClickHouse中的工作原理是很重要的(主键的实现似乎出乎意料!):
- ClickHouse中的主键不是表中每行唯一的
ClickHouse表的主键决定数据在写入磁盘时如何排序。每8,192行或10MB的数据(称为索引粒度,index granularity
)在主键索引文件中创建一个条目。这种粒度概念创建了一个可以轻松放入内存的稀疏索引(sparse index
),粒度(granules
)表示SELECT
查询期间处理的最少量列数据的条带。
主键可以使用PRIMARY KEY
参数定义。如果您定义了一个没有指定PRIMARY KEY的表,那么该键将变成ORDER BY
子句中指定的元组。如果同时指定了PRIMARY KEY和ORDER BY,则主键必须是排序顺序的子集。
主键也是排序键,它是一个元组(user_id, timestamp)
。因此,存储在每个列文件中的数据将按user_id
排序,然后按timestamp
排序。
2、插入数据到ClickHouse
您可以在ClickHouse中使用熟悉的INSERT INTO TABLE
命令,但重要的是要理解,每次插入到MergeTree
表中都会导致在存储中创建一个part
。即使是一个简单的例子,让我们一次插入多行:
INSERT INTO helloworld.my_first_table (user_id, message, timestamp, metric) VALUES
(