Skip to main content
与大多数数据库一样,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 位浮点数
表引擎决定了:
  • 数据如何存储以及存储在何处
  • 支持哪些查询
  • 数据是否复制
可选引擎有很多,但对于单节点 ClickHouse server 上的简单表,MergeTree 往往是首选。

主键简介

在继续之前,务必要先了解 ClickHouse 中主键的工作方式 (它的实现可能会让你有些意外!) :
  • ClickHouse 中的主键并不要求表中每一行都唯一
ClickHouse 表的主键决定了数据写入磁盘时的排序方式。每 8,192 行或 10MB 数据 (称为索引粒度) 都会在主键索引文件中创建一个条目。这个粒度概念形成了稀疏索引,因此索引可以轻松放入内存;而 granules 则表示执行 SELECT 查询时会处理的最小列数据条带。 可以使用 PRIMARY KEY 参数定义主键。如果定义表时未指定 PRIMARY KEY,则该键默认为 ORDER BY 子句中指定的元组。如果同时指定了 PRIMARY KEYORDER BY,则主键必须是排序顺序的前缀。 主键同时也是排序键,即由 (user_id, timestamp) 组成的元组。因此,每个列文件中存储的数据都会先按 user_id 排序,再按 timestamp 排序。
如需了解更多详细信息,请查看 ClickHouse Academy 中的 Modeling Data 培训模块
Last modified on June 10, 2026