Skip to main content

在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位无符号整数
  • messageString数据类型,用于替换其他数据库系统中的VARCHARBLOBCLOB等类型
  • timestampDateTime值,表示时间的瞬间
  • metric:32位浮点数
note

表引擎决定:

  • 数据的存储方式和位置
  • 支持哪些查询
  • 数据是否被复制
  • 是否支持分布式查询

有许多引擎可供选择,但对于单节点ClickHouse服务器上的简单表,MergeTree是您的首选。

主键简介

在继续之前,重要的是要了解ClickHouse中主键的工作原理(主键的实现可能看起来出乎意料!):

  • ClickHouse中的主键对于表中的每一行不是唯一的

ClickHouse表的主键决定了数据在写入磁盘时的排序方式。每8,192行或10MB的数据(称为索引粒度)在主键索引文件中创建一个条目。这种粒度概念创建了一个稀疏索引,可以轻松地适应内存,并且这些粒度代表了在SELECT查询期间处理的最小列数据条带。

主键可以使用PRIMARY KEY参数来定义。如果您定义一个没有指定PRIMARY KEY的表,那么键将成为ORDER BY子句中指定的元组。如果同时指定了PRIMARY KEYORDER BY,则主键必须是排序顺序的子集。

主键也是排序键,是一个元组(user_id, timestamp)。因此,存储在每个列文件中的数据将按user_id,然后按timestamp排序。

tip

有关更多详细信息,请查看ClickHouse Academy中的Creating Databases and Tables培训课程。