创建新数据库。
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)] [SETTINGS ...] [COMMENT 'Comment']子句
IF NOT EXISTS
如果 db_name 数据库已存在,则 ClickHouse 不会创建新的数据库,并且:
- 如果指定了该子句,则不会抛出异常。
- 如果未指定该子句,则会抛出异常。
ON CLUSTER
ClickHouse 会在指定集群的所有服务器上创建 db_name 数据库。更多信息,请参见 Distributed DDL 一文。
引擎
默认情况下,ClickHouse 使用其自带的 Atomic 数据库引擎。另有 MySQL、PostgresSQL、MaterializedPostgreSQL、Replicated 和 SQLite。
注释
你可以在创建数据库时添加注释。
所有数据库引擎均支持注释。
语法
CREATE DATABASE db_name ENGINE = engine(...) COMMENT 'Comment'示例
CREATE DATABASE db_comment ENGINE = Memory COMMENT 'The temporary database';
SELECT name, comment FROM system.databases WHERE name = 'db_comment';┌─name───────┬─comment────────────────┐
│ db_comment │ The temporary database │
└────────────┴────────────────────────┘SETTINGS
lazy_load_tables
启用后,数据库启动时不会完全加载各个表。相反,系统会为每个表创建一个轻量级代理,并在首次访问时才将实际的表引擎物化出来。对于包含大量表、但实际只会查询其中一部分的数据库,这可以减少启动时间和内存使用量。
CREATE DATABASE db_name ENGINE = Atomic SETTINGS lazy_load_tables = 1;适用于将表元数据存储在磁盘上的数据库 引擎 (例如 Atomic、Ordinary) 。无论此设置如何,视图、materialized view、字典以及基于表函数的表始终都会立即加载。
何时使用: 对于拥有大量表 (数百张甚至数千张) 、但只有一部分会被频繁查询的数据库,此设置非常有用。它会将表引擎对象的创建、数据分区片段的扫描以及后台线程的初始化推迟到首次访问时再进行,从而减少服务器启动时间和内存占用。
对 system.tables 的影响:
- 在表被访问之前,
system.tables会将其引擎显示为TableProxy。首次访问后,则会显示真实的引擎名称 (例如MergeTree) 。 - 对于尚未加载的表,
total_rows和total_bytes等列会返回NULL,因为真实存储此时尚未创建。
与 DDL 操作的交互:
SELECT、INSERT、ALTER、DROP在首次使用时会透明地触发真实表引擎的加载。RENAME TABLE无需触发加载即可工作。- 表一旦加载,在服务器进程的整个生命周期内都会保持已加载状态。
限制:
- 依赖
system.tables元数据 (例如total_rows、engine) 的监控工具,看到的未加载表信息可能不完整。 - 对未加载表执行第一次查询时会产生一次性加载开销 (解析已存储的
CREATE TABLE语句并初始化引擎) 。
默认值:0 (禁用) 。