ClickHouse基本操做(二)

 

1、先來講一下,ClickHouse爲啥快mysql

  1. MySQL單條SQL是單線程的,只能跑滿一個core,ClickHouse相反,有多少CPU,吃多少資源,因此飛快;
  2. ClickHouse不支持事務,不存在隔離級別。這裏要額外說一下,有人以爲,你一個數據庫都不支持事務,不支持ACID還玩個毛。ClickHouse的定位是分析性數據庫,而不是嚴格的關係型數據庫。又有人要問了,數據都不一致,統計個毛。舉個例子,汽車的油表是100%準確麼?爲了得到一個100%準確的值,難道每次測量你都要停車檢查麼?統計數據的意義在於用大量的數據看規律,看趨勢,而不是100%準確。
  3. IO方面,MySQL是行存儲,ClickHouse是列存儲,後者在count()這類操做自然有優點,同時,在IO方面,MySQL須要大量隨機IO,ClickHouse基本是順序IO。
  4. 有人可能以爲上面的數據導入的時候,數據確定緩存在內存裏了,這個的確,可是ClickHouse基本上是順序IO,用過就知道了,對IO基本沒有過高要求,固然,磁盤越快,上層處理越快,可是99%的狀況是,CPU先跑滿了(數據庫裏太少見了,大多數都是IO不夠用)。

2、建立庫sql

CREATE/ATTACH DATABASE zabbix ENGINE = Ordinary;數據庫

ATTACH 也能夠建庫,可是metadata目錄下不會生成.sql文件,通常用於metadata元數據sql文件被刪除後,恢復庫表結構使用緩存

3、建立本地表分佈式

CREATE TABLE test02( id UInt16,col1 String,col2 String,create_date date ) ENGINE = MergeTree(create_date, (id), 8192);函數

ENGINE:是表的引擎類型,工具

MergeTree:最經常使用的,MergeTree要求有一個日期字段,還有主鍵。線程

Log引擎沒有這個限制,也是比較經常使用。server

ReplicatedMergeTree:MergeTree的分支,表複製引擎。xml

Distributed:分佈式引擎。

create_date:是表的日期字段,一個表必需要有一個日期字段。

id:是表的主鍵,主鍵能夠有多個字段,每一個字段用逗號分隔。

8192:是索引粒度,用默認值8192便可。

4、建立分佈式表

CREATE TABLE distributed_table AS table ENGINE = Distributed(cluster, db, table, rand());

cluster:配置文件中的羣集名稱。

db:庫名。

table:本地表名。

rand():分片方式:隨機。

intHash64():分片方式:指定字段作hash。

Distribute引擎會選擇每一個分發到的Shard中的」健康的」副本執行SQL

5、DDL

若是想按集羣操做,須要藉助zookeeper,在config.xml中添加配置

<distributed_ddl>

<path>/clickhouse/task_queue/ddl</path>

</distributed_ddl>

一個節點建立表,會同步到各個節點

CREATE TABLE db.table [ON CLUSTER cluster] (...)

添加、刪除、修改列

ALTER TABLE [db].table [ON CLUSTER cluster] ADD|DROP|MODIFY COLUMN ...

rename 支持*MergeTree和Distributed

rename table db.table1 to db.table2 [ON CLUSTER cluster]

truncate table db.table;不支持Distributed引擎

6、delete/update 不支持Distributed引擎

ALTER TABLE [db.]table DELETE WHERE filter_expr...

ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE ...

7、分區表

按時間分區:

toYYYYMM(EventDate):按月分區

toMonday(EventDate):按周分區

toDate(EventDate):按天分區

按指定列分區:

PARTITION BY cloumn_name

對分區的操做:

alter table test1 DROP PARTITION [partition]   #刪除分區

alter table test1 DETACH PARTITION [partition]#下線分區

alter table test1 ATTACH PARTITION [partition]#恢復分區

alter table .test1 FREEZE PARTITION [partition]#備份分區

8、數據同步

1)    採用remote函數

insert into db.table select * from remote('目標IP',db.table,'user','passwd')

2)    csv文件導入clickhouse

cat test.csv | clickhouse-client -u user --password password --query="INSERT INTO db.table FORMAT CSV"

3)    同步mysql庫中表

CREATE TABLE tmp ENGINE = MergeTree ORDER BY id AS SELECT * FROM mysql('hostip:3306', 'db', 'table', 'user', 'passwd') ;

4) clickhouse-copier 工具

9、時間戳轉換

select toUnixTimestamp('2018-11-25 00:00:02');

select toDateTime(1543075202);

10、其餘事項

1)    clickhouse的cluster環境中,每臺server的地位是等價的,即不存在master-slave之說,是multi-master模式。

2)    各replicated表的宿主server上要在hosts裏配置其餘replicated表宿主server的ip和hostname的映射。

3)    上面描述的在不一樣的server上創建全新的replicated模式的表,若是在某臺server上已經存在一張replicated表,而且表中已經有數據,這時在另外的server上執行完replicated建表語句後,已有數據會自動同步到其餘server上面。

4)    若是zookeeper掛掉,replicated表會切換成read-only模式,再也不進行數據同步,系統會週期性的嘗試與zk從新創建鏈接。

5)    若是在向一張replicated表insert數據的時候zookeeper掛掉,這時候會拋一個異常,等到與zk從新創建鏈接之後,系統(其餘replicated表所在server)會檢查本地文件與預期文件(保存在zk上)的差異,若是是輕微的差異,直接同步覆蓋,若是發現有數據塊損壞或者識別不了,則將這些數據文件移動到「detached」子目錄,而後從新根據zk所記錄的文件信息進行副本的同步。

6)    drop掉某一臺server上的replicated表,不會對其餘server上面的replicated表形成影響。

相關文章
相關標籤/搜索