這裡會介紹ClickHouse幾種資料庫引擎,已經對應的特點和應用的場景。資料庫引擎允許您處理資料表。預設情況下,ClickHouse使用Atomic資料庫引擎。它提供了可設定的table engines和SQL dialect。
目前的資料庫引擎:
支援非阻塞的DROP TABLE和RENAME TABLE查詢和原子的EXCHANGE TABLES t1 AND t2查詢。預設情況下使用Atomic資料庫引擎。
CREATE DATABASE test[ ENGINE = Atomic];
資料庫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查詢是在不更改UUID和移動表資料的情況下執行的。這些查詢不會等待使用表的查詢完成,而是會立即執行。
在DROP TABLE上,不刪除任何資料,資料庫Atomic只是通過將後設資料移動到/clickhouse_path/metadata_dropped/將表標記為已刪除,並通知後臺執行緒。最終表資料刪除前的延遲由database_atomic_delay_before_drop_table_sec設定指定。
可以使用SYNC修飾符指定同步模式。使用database_atomic_wait_for_drop_and_detach_synchronously設定執行此操作。
EXCHANGE以原子方式交換表。
-- 非原子操作
RENAME TABLE new_table TO tmp, old_table TO new_table, tmp TO old_table;
--原子操作
EXCHANGE TABLES new_table AND old_table;
對於ReplicatedMergeTree表,建議不要在ZooKeeper和副本名稱中指定engine-path的引數。在這種情況下,將使用設定的引數default_replica_path和default_replica_name。
如果要顯式指定引擎的引數,建議使用{uuid}宏。這是非常有用的,以便為ZooKeeper中的每個表自動生成唯一的路徑。
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')
引擎引數
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服務。支援讀寫操作(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`]);
引擎引數
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資料庫,並支援ClickHouse和SQLite交換資料, 執行INSERT和SELECT查詢。
SQLite將整個資料庫(定義、表、索引和資料本身)儲存為主機上的單個跨平臺檔案。在寫入過程中,SQLite會鎖定整個資料庫檔案,因此寫入操作是順序執行的。讀操作可以是多工的。SQLite不需要服務管理(如啟動指令碼)或基於GRANT和密碼的存取控制。存取控制是通過授予資料庫檔案本身的檔案系統許可權來處理的。
CREATE DATABASE sqlite_database
ENGINE = SQLite('db_path')
引擎引數
SQLite | ClickHouse |
---|---|
INTEGER | Int32 |
REAL | Float32 |
TEXT | String |
BLOB | String |
在最後一次存取之後,只在RAM中儲存expiration_time_in_seconds秒。只能用於Log表。
它是為儲存許多小的Log表而優化的,對於這些表,存取之間有很長的時間間隔。
CREATE DATABASE testlazy ENGINE = Lazy(expiration_time_in_seconds);
該引擎基於Atomic引擎。它支援通過將DDL紀錄檔寫入ZooKeeper並在給定資料庫的所有副本上執行的後設資料複製。
一個ClickHouse伺服器可以同時執行和更新多個複製的資料庫。但是同一個複製的資料庫不能有多個副本。
這是一個實驗性的引擎,不應該在生產中使用。
CREATE DATABASE testdb ENGINE = Replicated('zoo_path', 'shard_name', 'replica_name') [SETTINGS ...]
建立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 ...]
使用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 ...]
本文來自部落格園,作者:張飛的豬,轉載請註明原文連結:https://www.cnblogs.com/the-pig-of-zf/p/16771673.html
作者公眾號:張飛的豬巨量資料分享,不定期分享巨量資料學習的總結和相關資料,歡迎關注。