这里会介绍 ClickHouse 几种数据库引擎,曾经对应的特点和利用的场景。数据库引擎容许您解决数据表。默认状况下,ClickHouse 应用 Atomic 数据库引擎。它提供了可配置的 table engines 和 SQL dialect。
目前的数据库引擎:
- MySQL
- MaterializeMySQL
- Lazy
- Atomic
- PostgreSQL
- MaterializedPostgreSQL
- Replicated
- SQLite
Atomic
反对非阻塞的 DROP TABLE 和 RENAME TABLE 查问和原子的 EXCHANGE TABLES t1 AND t2 查问。默认状况下应用 Atomic 数据库引擎。
建表语句
CREATE DATABASE test[ENGINE = Atomic];
个性
Table UUID
数据库 Atomic 中的所有表都有惟一的 UUID,并将数据存储在目录 /clickhouse_path/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/,其中 xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy 是该表的 UUID。
通常,UUID 是主动生成的,但用户也能够在创立表时以雷同的形式显式指定 UUID(不倡议这样做)。例如:
CREATE TABLE name UUID '28f1c61c-2970-457a-bffe-454156ddcfef' (n UInt64) ENGINE = ...;
RENAME TABLES
RENAME 查问是在不更改 UUID 和挪动表数据的状况下执行的。这些查问不会期待应用表的查问实现,而是会立刻执行。
DROP/DETACH TABLES
在 DROP TABLE 上,不删除任何数据,数据库 Atomic 只是通过将元数据挪动到 /clickhouse_path/metadata_dropped/ 将表标记为已删除,并告诉后盾线程。最终表数据删除前的提早由 database_atomic_delay_before_drop_table_sec 设置指定。
能够应用 SYNC 修饰符指定同步模式。应用 database_atomic_wait_for_drop_and_detach_synchronously 设置执行此操作。
EXCHANGE TABLES
EXCHANGE 以原子形式替换表。
-- 非原子操作
RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table;
-- 原子操作
EXCHANGE TABLES new_table AND old_table;
ReplicatedMergeTree in Atomic Database
对于 ReplicatedMergeTree 表,倡议不要在 ZooKeeper 和正本名称中指定 engine-path 的参数。在这种状况下,将应用配置的参数 default_replica_path 和 default_replica_name。
如果要显式指定引擎的参数,倡议应用 {uuid} 宏。这是十分有用的,以便为 ZooKeeper 中的每个表主动生成惟一的门路。
MySQL
MySQL 引擎用于将近程的 MySQL 服务器中的表映射到 ClickHouse 中,并容许您对表进行 INSERT 和 SELECT 查问,以不便您在 ClickHouse 与 MySQL 之间进行数据交换。
MySQL 数据库引擎会将对其的查问转换为 MySQL 语法并发送到 MySQL 服务器中,因而您能够执行诸如 SHOW TABLES 或 SHOW CREATE TABLE 之类的操作。
但无奈对其执行操作:RENAME、CREATE TABLE 和 ALTER。
创立数据库
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MySQL('host:port', ['database' | database], 'user', 'password')
引擎参数
- host:port — MySQL 服务地址
- database — MySQL 数据库名称
- user — MySQL 用户名
- password — MySQL 用户明码
mysql 与 ClickHouse 数据类型对应
MySQL | ClickHouse |
---|---|
UNSIGNED TINYINT | UInt8 |
TINYINT | Int8 |
UNSIGNED SMALLINT | UInt16 |
SMALLINT | Int16 |
UNSIGNED INT | UInt32 |
UNSIGNED MEDIUMINT | UInt32 |
INT,MEDIUMINT | Int32 |
UNSIGNED BIGINT | UInt64 |
BIGINT | Int64 |
FLOAT | Float32 |
DOUBLE | Float64 |
DATE | Date |
DATETIME,TIMESTAMP | DateTime |
BINARY | FixedString |
其余的 MySQL 数据类型将全副都转换为 String。
应用例子
MySQL 操作:
mysql> USE test;
Database changed
mysql> CREATE TABLE `mysql_table` (
-> `int_id` INT NOT NULL AUTO_INCREMENT,
-> `float` FLOAT NOT NULL,
-> PRIMARY KEY (`int_id`));
Query OK, 0 rows affected (0,09 sec)
mysql> insert into mysql_table (`int_id`, `float`) VALUES (1,2);
Query OK, 1 row affected (0,00 sec)
mysql> select * from mysql_table;
+------+-----+
| int_id | value |
+------+-----+
| 1 | 2 |
+------+-----+
1 row in set (0,00 sec)
ClickHouse 中的数据库,与 MySQL 服务器替换数据:
CREATE DATABASE mysql_db ENGINE = MySQL('localhost:3306', 'test', 'my_user', 'user_password')
SHOW DATABASES
┌─name─────┐
│ default │
│ mysql_db │
│ system │
└──────────┘
SHOW TABLES FROM mysql_db
┌─name─────────┐
│ mysql_table │
└──────────────┘
SELECT * FROM mysql_db.mysql_table
┌─int_id─┬─value─┐
│ 1 │ 2 │
└────────┴───────┘
INSERT INTO mysql_db.mysql_table VALUES (3,4)
SELECT * FROM mysql_db.mysql_table
┌─int_id─┬─value─┐
│ 1 │ 2 │
│ 3 │ 4 │
└────────┴───────┘
PostgreSQL
容许连贯到近程 PostgreSQL 服务。反对读写操作(SELECT 和 INSERT 查问),以在 ClickHouse 和 PostgreSQL 之间替换数据。
在 SHOW TABLES 和 DESCRIBE TABLE 查问的帮忙下,从近程 PostgreSQL 实时拜访表列表和表构造。
反对表构造批改 (ALTER TABLE … ADD|DROP COLUMN)。如果 use_table_cache 参数(参见上面的引擎参数) 设置为 1,则会缓存表构造,不会查看是否被批改,但能够用 DETACH 和 ATTACH 查问进行更新。
应用总体上与 mysql 引擎相似
创立数据库
CREATE DATABASE test_database
ENGINE = PostgreSQL('host:port', 'database', 'user', 'password'[, `use_table_cache`]);
引擎参数
- host:port — PostgreSQL 服务地址
- database — 近程数据库名次
- user — PostgreSQL 用户名称
- password — PostgreSQL 用户明码
- schema – PostgreSQL 模式
- use_table_cache — 定义数据库表构造是否已缓存或不进行。可选的。默认值:0
数据类型对应
PostgreSQL | ClickHouse |
---|---|
DATE | Date |
TIMESTAMP | DateTime |
REAL | Float32 |
DOUBLE | Float64 |
DECIMAL | Decimal |
NUMERIC | Decimal |
SMALLINT | Int16 |
INTEGER | Int32 |
BIGINT | Int64 |
SERIAL | UInt32 |
BIGSERIAL | UInt64 |
TEXT | String |
CHAR | String |
INTEGER | Nullable(Int32) |
ARRAY | Array |
SQLite
容许连贯到 SQLite 数据库,并反对 ClickHouse 和 SQLite 替换数据,执行 INSERT 和 SELECT 查问。
SQLite 将整个数据库 (定义、表、索引和数据自身) 存储为主机上的单个跨平台文件。在写入过程中,SQLite 会锁定整个数据库文件,因而写入操作是程序执行的。读操作能够是多任务的。SQLite 不须要服务治理 (如启动脚本) 或基于 GRANT 和明码的访问控制。访问控制是通过授予数据库文件自身的文件系统权限来解决的。
创立数据库
CREATE DATABASE sqlite_database
ENGINE = SQLite('db_path')
引擎参数
- db_path — SQLite 数据库文件的门路
数据类型对应
SQLite | ClickHouse |
---|---|
INTEGER | Int32 |
REAL | Float32 |
TEXT | String |
BLOB | String |
Lazy
在最初一次拜访之后,只在 RAM 中保留 expiration_time_in_seconds 秒。只能用于 Log 表。
它是为存储许多小的 Log 表而优化的,对于这些表,拜访之间有很长的工夫距离。
创立数据库
CREATE DATABASE testlazy ENGINE = Lazy(expiration_time_in_seconds);
Replicated
该引擎基于 Atomic 引擎。它反对通过将 DDL 日志写入 ZooKeeper 并在给定数据库的所有正本上执行的元数据复制。
一个 ClickHouse 服务器能够同时运行和更新多个复制的数据库。然而同一个复制的数据库不能有多个正本。
这是一个实验性的引擎,不应该在生产中应用。
创立数据库
CREATE DATABASE testdb ENGINE = Replicated('zoo_path', 'shard_name', 'replica_name') [SETTINGS ...]
MaterializeMySQL
创立 ClickHouse 数据库,蕴含 MySQL 中所有的表,以及这些表中的所有数据。
ClickHouse 服务器作为 MySQL 正本工作。它读取 binlog 并执行 DDL 和 DML 查问。
这是一个实验性的引擎,不应该在生产中应用。
创立数据库
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MaterializeMySQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...]
MaterializedPostgreSQL
应用 PostgreSQL 数据库表的初始数据转储创立 ClickHouse 数据库,并启动复制过程,即执行后台作业,以便在近程 PostgreSQL 数据库中的 PostgreSQL 数据库表上产生新更改时利用这些更改。
ClickHouse 服务器作为 PostgreSQL 正本工作。它读取 WAL 并执行 DML 查问。DDL 不是复制的,但能够解决(如下所述)。
这是一个实验性的引擎,不应该在生产中应用。
创立数据库
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster]
ENGINE = MaterializedPostgreSQL('host:port', ['database' | database], 'user', 'password') [SETTINGS ...]
材料分享
ClickHouse 经典中文文档分享
参考文章
- ClickHouse(01)什么是 ClickHouse,ClickHouse 实用于什么场景
- ClickHouse(02)ClickHouse 架构设计介绍概述与 ClickHouse 数据分片设计
- ClickHouse(03)ClickHouse 怎么装置和部署
- ClickHouse(04)如何搭建 ClickHouse 集群
- ClickHouse(05)ClickHouse 数据类型详解
- ClickHouse(06)ClickHouse 建表语句 DDL 具体解析