07 ClickHouseClickHouse数据库引擎解析

目录

  • Atomic
    • 建表语句
    • 特性
      • Table UUID
      • RENAME TABLES
      • DROP/DETACH TABLES
      • EXCHANGE TABLES
      • ReplicatedMergeTree in Atomic Database
  • MySQL
    • 创建数据库
    • mysql与ClickHouse数据类型对应
    • 使用例子
  • PostgreSQL
    • 创建数据库
    • 数据类型对应
  • SQLite
    • 创建数据库
    • 数据类型对应
  • Lazy
    • 创建数据库
  • Replicated
    • 创建数据库
  • MaterializeMySQL
    • 创建数据库
  • MaterializedPostgreSQL
    • 创建数据库
  • 资料分享
  • 参考文章
这里会介绍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 TABLESRENAME查询是在不更改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 TABLESEXCHANGE以原子方式交换表 。
-- 非原子操作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中的每个表自动生成唯一的路径 。
MySQLMySQL引擎用于将远程的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数据类型对应MySQLClickHouseUNSIGNED TINYINTUInt8TINYINTInt8UNSIGNED SMALLINTUInt16SMALLINTInt16UNSIGNED INTUInt32UNSIGNED MEDIUMINTUInt32INT,MEDIUMINTInt32UNSIGNED BIGINTUInt64BIGINTInt64FLOATFloat32DOUBLEFloat64DATEDateDATETIME,TIMESTAMPDateTimeBINARYFixedString其他的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 │└────────┴───────┘

推荐阅读