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 │└────────┴───────┘

推薦閱讀