创建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.