在 ClickHouse 中创建表
像大多数数据库一样,ClickHouse 在逻辑上将表分组到数据库中。使用 CREATE DATABASE
命令在 ClickHouse 中创建一个新的数据库
CREATE DATABASE IF NOT EXISTS helloworld
类似地,使用 CREATE TABLE
定义一个新表。(如果您未指定数据库名称,则该表将位于 default
数据库中。)以下表名为 my_first_table
,位于 helloworld
数据库中
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 中是如何工作的(主键的实现可能看起来出乎意料!)
- ClickHouse 中的主键对于表中的每一行 不是唯一的
ClickHouse 表的主键决定了数据写入磁盘时的排序方式。每 8,192 行或 10MB 数据(称为索引粒度)会在主键索引文件中创建一个条目。这种粒度概念创建了一个可以轻松容纳在内存中的稀疏索引,并且 granules 代表了在
SELECT
查询期间处理的最小列数据条带。可以使用
PRIMARY KEY
参数定义主键。如果您定义表时未指定PRIMARY KEY
,则键将成为ORDER BY
子句中指定的元组。如果您同时指定了PRIMARY KEY
和ORDER BY
,则主键必须是排序顺序的前缀。主键也是排序键,它是
(user_id, timestamp)
的元组。因此,存储在每个列文件中的数据将首先按user_id
排序,然后按timestamp
排序。
有关更多详细信息,请查看 ClickHouse 学院中的 数据建模培训模块。