这里会介绍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数据类型对应

MySQLClickHouse
UNSIGNED TINYINTUInt8
TINYINTInt8
UNSIGNED SMALLINTUInt16
SMALLINTInt16
UNSIGNED INTUInt32
UNSIGNED MEDIUMINTUInt32
INT,MEDIUMINTInt32
UNSIGNED BIGINTUInt64
BIGINTInt64
FLOATFloat32
DOUBLEFloat64
DATEDate
DATETIME,TIMESTAMPDateTime
BINARYFixedString

其余的MySQL数据类型将全副都转换为String。

应用例子

MySQL操作:

mysql> USE test;Database changedmysql> 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

数据类型对应

PostgreSQLClickHouse
DATEDate
TIMESTAMPDateTime
REALFloat32
DOUBLEFloat64
DECIMALDecimal
NUMERICDecimal
SMALLINTInt16
INTEGERInt32
BIGINTInt64
SERIALUInt32
BIGSERIALUInt64
TEXTString
CHARString
INTEGERNullable(Int32)
ARRAYArray

SQLite

容许连贯到SQLite数据库,并反对ClickHouse和SQLite替换数据, 执行INSERT和SELECT查问。

SQLite将整个数据库(定义、表、索引和数据自身)存储为主机上的单个跨平台文件。在写入过程中,SQLite会锁定整个数据库文件,因而写入操作是程序执行的。读操作能够是多任务的。SQLite不须要服务治理(如启动脚本)或基于GRANT和明码的访问控制。访问控制是通过授予数据库文件自身的文件系统权限来解决的。

创立数据库

    CREATE DATABASE sqlite_database     ENGINE = SQLite('db_path')

引擎参数

  • db_path — SQLite 数据库文件的门路

数据类型对应

SQLiteClickHouse
INTEGERInt32
REALFloat32
TEXTString
BLOBString

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具体解析