一、關於clickhouse引擎
ch數據庫和表都可以設置自己的引擎,不同數據選擇適合的引擎效率會增加。不同的引擎代表不同的類型,比如擁有何種特性、數據以何種形式被存儲以及如何被加載。這個概念在其他數據庫里體現的不多。
引擎參考:https://blog.csdn.net/qq_42979842/article/details/108939841
1.1、數據庫引擎
Ordinary
默認引擎,此數據庫可以使用任意表引擎。
Dictionary
字典引擎,此數據庫會為所有數據字典創建數據表。
Memory
內存引擎,此數據庫中的表只存放在內存中,重啟丟失。
Lazy
日志引擎,此數據庫只能使用Log系列的表引擎。
MySQL
MySQL引擎,此數據庫可以自動拉取遠端MySQL數據(類似於Oracle的dblink,可以對遠程表進行讀寫)
1.2、數據表引擎
1.3、數據庫集群和分布式的概念
-數據庫集群有的具有單份數據集,有的具有兩份或多份相似的數據集,有的具有兩份或多份實時一致的數據集,是將幾台服務器集中在一起,實現同一數據集業務;而分布式數據庫系統往往具有完全不同的數據集,是將幾台服務器集中在一起,實現不同數據集的業務。
-數據庫集群往往是同構的系統,要求集群各節點都具有相同的操作系統和數據庫系統版本,甚至補丁包的版本也要求保持一致;而分布式數據庫系統可以是異構系統,包含不同的操作系統和不同的數據庫系統。
-數據庫集群往往建立在高速局域網內,一般在一個網段內;而分布式數據庫系統既可以是高速局域網,也可以是跨部門、跨單位的異地遠程網絡,一般是跨網段,需要路由。
-數據庫集群組織緊密,一台節點跨了,其他節點可以立即頂上,服務保證延續;而分布式數據庫組織松散,一個節點跨了,那這個節點的數據服務就不可用了。
-分布式數據庫的數據處理一般需要多個節點分布式執行,協同配合才能出結果;而數據庫集群不一定需要分布式協作就能出結果;
-分布式數據庫中的每一個數據節點,為提升高可用和性能,都可以做成數據庫集群。
我們單機操作不涉及這么復雜的概念,一般一個單機數據庫就夠了,這里提出來是為了學習clickhouse的時候會遇到相關概念,免得一臉懵逼。
二、新建數據庫
基本語法:【方括號里的可以省略】
CREATE DATABASE [IF NOT EXISTS] db_name [ON CLUSTER cluster] [ENGINE = engine(...)]
舉例:
CREATE DATABASE IF NOT EXISTS mydb;
使用默認引擎Ordinary,在此數據庫下可以使用任意類型的表引擎,在絕大多數情況下都只需使用默認的數據庫引擎
三、創建數據表
基本語法:
CREATE TABLE [IF NOT EXISTS][db.]table_name [ON CLUSTER cluster]
(name1 [type1] [DEFAULT|MATERIALIZED|ALIASexpr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],...) ENGINE = engine
后面的‘()’括號中的內容為表結構及引擎聲明;
其中:
DEFAULT – 默認值,如果INSERT中不包含指定的列,那么將通過表達式計算它的默認值並填充它;
MATERIALIZED – 物化表達式,被該表達式指定的列不能被INSERT,因為它總是被計算出來的,對於INSERT而言,不需要考慮這些列。 另外,在SELECT查詢中如果包含星號,此列不會被查詢;
ALIAS – 別名,這樣的列不會存儲在表中。它的值不能夠通過INSERT寫入,同時使用SELECT查詢星號時,這些列也不會被用來替換星號,但是它們可以顯示的用於SELECT中,在這種情況下,在查詢分析中別名將被替換
3.1、直接創建
create table t1(id UInt8,name String,address String)engine=MergeTree order by id
3.2、創建一個與其他表結構相同的表
create table t2 as t1 engine=MergeTree order by id
可以對其指定不同的表引擎聲明。如果沒有表引擎聲明,則創建的表將與db2.name2使用相同的表引擎。
3.3、使用指定的引擎創建一個與SELECT子句的結果具有相同結構的表,並使用SELECT子句的結果填充它
create table t3engine=TinyLog as select * from t1