发布日期:2022-12-02 VIP内容

创建ClickHouse数据库和表

下面我们将通过建模和查询示例网站访问数据来测试ClickHouse。

创建数据库和表

在ClickHouse中,可以通过在交互式数据库提示符中直接执行SQL语句来创建和删除数据库。语句由遵循特定语法的命令组成,这些命令告诉数据库服务器执行请求的操作以及所需的任何数据。

过使用CREATE DATABASE table_name语法创建数据库。要创建一个数据库,首先运行以下命令启动一个客户端会话:

$ clickhouse-client --multiline

接下来我们将创建一个名为test的数据库,并在该数据库中创建一个名为visit的表,用于跟踪网站访问时长。

现在已经进入了ClickHouse命令提示符。查看当前有哪些数据库,执行如下命令:

xueai8 :) show databases;

输出内容如下:

SHOW DATABASES

┌─name───────────────────────────┐
│ _temporary_and_external_tables │
│ default                        │
│ system                         │
└────────────────────────────────┘

3 rows in set. Elapsed: 0.006 sec.

可以看到,默认有两个数据库:default和system。

通过执行以下命令创建test数据库:

xueai8 :) CREATE DATABASE test;

将看到以下输出,显示已经创建了数据库:

CREATE DATABASE test

Ok.

0 rows in set. Elapsed: 0.003 sec.

ClickHouse表类似于其他关系数据库中的表;它以结构化的格式保存相关数据的集合。可以指定列及其类型,添加数据行,并在表上执行不同类型的查询。

在ClickHouse中创建表的语法遵循以下示例结构:

CREATE TABLE table_name
(
    column_name1 column_type [options],
    column_name2 column_type [options],
    ...
) ENGINE = engine

其中table_name和column_name值可以是任何有效的ASCII标识符。ClickHouse支持多种列类型;其中最受欢迎的有:

  • UInt64:用于存储0 ~ 18446744073709551615的整型值。
  • Float64:用于存储浮点数,如2039.23,10.5等。
  • String:用于存储可变长度字符。它不需要最大长度属性,因为它可以存储任意长度。
  • Date:用于存储“YYYY-MM-DD”格式的日期。
  • DateTime:用于存储日期与时间的耦合,格式为“YYYY-MM-DD HH:MM:SS”。

在列定义之后,指定用于表的引擎。在ClickHouse中,引擎决定了底层数据的物理结构、表的查询功能、并发访问模式以及对索引的支持。不同的引擎类型适合不同的应用需求。最常用和应用最广泛的引擎类型是MergeTree。

现在已经了解了表的创建,接下来将创建一个表。首先确认你要修改的数据库:

xueai8 :) USE test;

这将看到以下输出,显示已经从default数据库切换到test数据库:

USE test

Ok.

0 rows in set. Elapsed: 0.001 sec.

本教程的其余部分将假设在此数据库的上下文中执行语句。

通过运行下面这个命令创建的visits表:

CREATE TABLE visits (
   id UInt64,
   duration Float64,
   url String,
   created DateTime
) ENGINE = MergeTree() 
PRIMARY KEY id 
ORDER BY id;

下面是该命令所做的工作的详细说明。它创建了一个名为visitors的表,该表有四列:

  • id:主键列。与其他RDBMS系统类似,ClickHouse中的主键列唯一标识一行;对于这一列,每一行都应该有一个惟一的值。
  • duration:用于存储每次访问持续时间(以秒为单位)的浮点列。浮动列可以存储十进制值,例如12.50。
  • url:存储访问的URL的字符串列,例如http://example.com。
  • created:跟踪访问发生时间的日期和时间列。

在列定义之后,指定MergeTree作为表的存储引擎。推荐将MergeTree引擎家族(https://clickhouse.yandex/docs/en/operations/table_engines/mergetree/)用于生产数据库,因为它优化了对大型实时插入的支持、整体健壮性和查询支持。此外,MergeTree引擎支持按主键对行进行排序、对行进行分区以及复制和采样数据。

如果打算使用ClickHouse来归档不经常查询的数据或存储临时数据,那么可以使用Log引擎系列(https://clickhouse.yandex/docs/en/operations/table_engines/log_family/)来针对该用例进行优化。

在列定义之后,将定义其他表级选项。PRIMARY KEY子句将id设置为主键列,ORDER BY子句将存储按id列排序的值。主键唯一地标识一行,并用于有效地访问单行和有效的行托管。

在执行create语句时,将看到以下输出:

CREATE TABLE visits
(
    id UInt64,
    duration Float64,
    url String,
    created DateTime
)
ENGINE = MergeTree()
PRIMARY KEY id
ORDER BY id

Ok.

0 rows in set. Elapsed: 0.010 sec.

在本节中,我们已经创建了一个数据库和一个表来跟踪网站访问数据。在下一步中,将向表中插入数据、更新现有数据并删除该数据。

删除表和数据库

删除表的语法如下:

DROP TABLE table_name;

删除visits表,使用如下语句:

DROP TABLE visits;

将看到以下输出,声明已经成功删除了表:

DROP TABLE visits

Ok.

0 rows in set. Elapsed: 0.005 sec.

可以使用DROP database table_name 语法删除数据库。要删除test数据库,执行以下语句:

DROP DATABASE test;

结果显示已经成功删除了数据库:

DROP DATABASE test

Ok.

0 rows in set. Elapsed: 0.003 sec.