<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
表引擎作用: 資料的儲存方式和位置
支援哪些查詢以及如何支援
並行資料存取
索引的使用(如果存在)
是否可以執行多執行緒請求
資料複製引數
常見表引擎 | 家族 | 說明 | 索引 | 備註 |
---|---|---|---|---|
TinyLog | Log Family | 以列檔案的形式儲存在硬碟 資料寫入時,追加到檔案末尾 | 不支援 | 可用於儲存小批次處理的中間資料 |
Memory | 其它 | 資料以未壓縮的原始形式直接儲存在記憶體 | 不支援 | 適用於少量資料的高效能查詢 |
MergeTree | MergeTree Family | 支援 列式儲存、分割區、稀疏索引、二級索引… | 支援 | 單節點ClickHouse範例的預設表引擎 |
合併樹家族特點:
快速插入資料並進行後續的後臺資料處理
支援資料複製
支援分割區
支援稀疏索引
稀疏索引原理
稀疏索引佔用空間小,範圍批次查詢快,但單點查詢較慢
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], ... INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1, INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2 ) ENGINE = MergeTree() ORDER BY expr [PARTITION BY expr] [PRIMARY KEY expr] [SAMPLE BY expr] [TTL expr [DELETE|TO DISK 'xxx'|TO VOLUME 'xxx'], ...] [SETTINGS name=value, ...]
關鍵詞 | 簡述 |
---|---|
ENGINE | 引擎 |
ORDER BY | 資料排序規則 |
PARTITION BY | 分割區 |
PRIMARY KEY | 索引規則 |
TTL | 資料生命週期 |
SETTINGS | 其它設定 |
ORDER BY
(必選項)
規定了分割區內的資料按照哪些欄位進行按序儲存
如果不需要排序,就用ORDER BY tuple()
此情況下,資料順序是根據插入順序
如果想要按INSERT ... SELECT
的資料順序來儲存,就設定max_insert_threads=1
若想 按資料儲存順序查出資料,可用 單執行緒查詢
對於有序資料,資料一致性越高,壓縮效率越高
PRIMARY KEY
(可選項)
作用:為列資料提供稀疏索引(不是唯一約束),提升列查詢效率
預設情況下,主鍵與排序鍵相同;通常不需要顯式PRIMARY KEY
子句,除非主鍵≠排序鍵
要求:主鍵列必須是排序列的字首
例如ORDER BY (a,b)
則PRIMARY KEY
後可以是(a,b)
或(a)
sparse index
PARTITION BY
分割區(可選項)
分割區作用:縮小掃描範圍,優化查詢速度
並行:分割區後,面對涉及跨分割區的查詢統計,會以分割區為單位並行處理
如果不填:只會使用一個分割區
資料寫入與分割區合併:
任何一個批次的資料寫入 都會產生一個臨時分割區,不會納入任何一個已有的分割區。
寫入後,過一段時間(約10多分鐘),會自動執行合併操作,把臨時分割區的資料合併
可用OPTIMIZE TABLE 表名 [FINAL]
主動執行合併
通常不需要使用分割區鍵。使用時,不建議使用比月更細粒度的分割區鍵
分割區過多=>(列式)查詢時掃描檔案過多=>效能低
-- 建表 DROP TABLE IF EXISTS t1; CREATE TABLE t1( uid UInt32, sku_id String, total_amount Decimal(9,2), create_time Datetime ) ENGINE = MergeTree() PARTITION BY toYYYYMMDD(create_time) PRIMARY KEY (uid) ORDER BY (uid,sku_id); -- 插資料2次 INSERT INTO t1 VALUES (1,'sku1',1.00,'2020-06-01 12:00:00'), (2,'sku1',9.00,'2020-06-02 13:00:00'), (3,'sku2',6.00,'2020-06-02 12:00:00'); INSERT INTO t1 VALUES (1,'sku1',1.00,'2020-06-01 12:00:00'), (2,'sku1',9.00,'2020-06-02 13:00:00'), (3,'sku2',6.00,'2020-06-02 12:00:00'); -- 插完後立即插,會發現資料寫入臨時分割區,還未進行自動合併 SELECT * FROM t1; ┌─uid─┬─sku_id─┬─total_amount─┬─────────create_time─┐ │ 1 │ sku1 │ 1.00 │ 2020-06-01 12:00:00 │ └─────┴────────┴──────────────┴─────────────────────┘ ┌─uid─┬─sku_id─┬─total_amount─┬─────────create_time─┐ │ 1 │ sku1 │ 1.00 │ 2020-06-01 12:00:00 │ └─────┴────────┴──────────────┴─────────────────────┘ ┌─uid─┬─sku_id─┬─total_amount─┬─────────create_time─┐ │ 2 │ sku1 │ 9.00 │ 2020-06-02 13:00:00 │ │ 3 │ sku2 │ 6.00 │ 2020-06-02 12:00:00 │ └─────┴────────┴──────────────┴─────────────────────┘ ┌─uid─┬─sku_id─┬─total_amount─┬─────────create_time─┐ │ 2 │ sku1 │ 9.00 │ 2020-06-02 13:00:00 │ │ 3 │ sku2 │ 6.00 │ 2020-06-02 12:00:00 │ └─────┴────────┴──────────────┴─────────────────────┘ -- 手動合併分割區 OPTIMIZE TABLE t1 FINAL; -- 再次查詢,會看到分割區已經合併 SELECT * FROM t1; ┌─uid─┬─sku_id─┬─total_amount─┬─────────create_time─┐ │ 1 │ sku1 │ 1.00 │ 2020-06-01 12:00:00 │ │ 1 │ sku1 │ 1.00 │ 2020-06-01 12:00:00 │ └─────┴────────┴──────────────┴─────────────────────┘ ┌─uid─┬─sku_id─┬─total_amount─┬─────────create_time─┐ │ 2 │ sku1 │ 9.00 │ 2020-06-02 13:00:00 │ │ 2 │ sku1 │ 9.00 │ 2020-06-02 13:00:00 │ │ 3 │ sku2 │ 6.00 │ 2020-06-02 12:00:00 │ │ 3 │ sku2 │ 6.00 │ 2020-06-02 12:00:00 │ └─────┴────────┴──────────────┴─────────────────────┘
TTL:Time To Live
列TTL
當列中的值過期時,ClickHouse將用列資料型別的預設值替換它們
TTL子句不能用於鍵列
表TTL
當資料部分中的所有列值都過期,可以刪除資料
DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( d DateTime, -- 列生命週期(5秒) a Int TTL d + INTERVAL 5 SECOND )ENGINE = MergeTree() ORDER BY d -- 表生命週期(1分鐘) TTL d + INTERVAL 1 MINUTE DELETE; -- 插資料 INSERT INTO t1 VALUES (now(),2); -- 立即查 SELECT * FROM t1; ┌───────────────────d─┬─a─┐ │ 2022-11-01 14:39:17 │ 2 │ └─────────────────────┴───┘ -- 5秒後重新整理並查詢 OPTIMIZE TABLE t1 FINAL; SELECT * FROM t1; ┌───────────────────d─┬─a─┐ │ 2022-11-01 14:39:17 │ 0 │ └─────────────────────┴───┘ -- 1分鐘後查 OPTIMIZE TABLE t1 FINAL; SELECT * FROM t1; -- 過期資料行被刪除
立即查,TTL列值為2
,5秒後查值為0
,1分鐘後查此資料被刪除
常見設定 | 說明 | 預設值 | 備註 |
---|---|---|---|
index_granularity | 索引粒度。索引中相鄰的『標記』間的資料行數 | 8192 | 通常不用改 |
index_granularity_bytes | 索引粒度,以位元組為單位 | 10Mb | 資料量很大 且 資料一致性很高 時 可考慮 調大索引粒度 |
min_index_granularity_bytes | 允許的最小資料粒度 | 1024b | 用於防止 新增索引粒度很低的表 |
ReplacingMergeTree具有去重功能:分割區內按排序鍵去重
資料的去重只會在資料合併期間進行
合併會在後臺一個不確定的時間進行
可用OPTIMIZE
語句發起計劃外的合併,但會引發資料的大量讀寫
ReplacingMergeTree適用於在後臺清除重複的資料,但是不保證沒有重複資料出現
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... ) ENGINE = ReplacingMergeTree([ver]) [PARTITION BY expr] [ORDER BY expr] [SAMPLE BY expr] [SETTINGS name=value, ...]
ver
是版本列,是可選引數,型別可為UInt
、Date
、DateTime
在資料合併時,ReplacingMergeTree從相同排序鍵的行中選擇一行留下:
如果ver
列未指定,就保留最後一條
如果ver
列已指定,就保留ver
值最大的版本
DROP TABLE IF EXISTS t1; CREATE TABLE t1( uid UInt32, sku_id String, create_time Datetime ) ENGINE = ReplacingMergeTree(create_time) PARTITION BY sku_id ORDER BY (uid); INSERT INTO t1 VALUES (1,'s1','2022-06-01 00:00:00'), (1,'s1','2022-06-02 11:11:11'), (1,'s2','2022-06-02 13:00:00'), (2,'s2','2022-06-02 12:12:12'), (2,'s2','2022-06-02 00:00:00'); SELECT * FROM t1; -- 插了5條資料,去重了,查出來只有3條,不同分割區沒有去重 ┌─uid─┬─sku_id─┬─────────create_time─┐ │ 1 │ s1 │ 2022-06-02 11:11:11 │ └─────┴────────┴─────────────────────┘ ┌─uid─┬─sku_id─┬─────────create_time─┐ │ 1 │ s2 │ 2022-06-02 13:00:00 │ │ 2 │ s2 │ 2022-06-02 12:12:12 │ └─────┴────────┴─────────────────────┘
適用場景:不需要查詢明細,只查詢 按維度聚合求和 的場景
原理:預聚合
優點:加快聚合求和查詢、節省空間
語法:SummingMergeTree([columns])
columns
是可選引數,必須是數值型別,並且不可位於主鍵中
所選列將會被預聚合求和;若預設,則所有非維度數位列將會被聚合求和
DROP TABLE IF EXISTS t1; CREATE TABLE t1( uid UInt32, amount1 Decimal(9,2), amount2 Decimal(9,2) ) ENGINE = SummingMergeTree(amount1) ORDER BY (uid); INSERT INTO t1 VALUES (1,1.00,2.00),(1,9.00,8.00); SELECT * FROM t1; ┌─uid─┬─amount1─┬─amount2─┐ │ 1 │ 10.00 │ 2.00 │ └─────┴─────────┴─────────┘ INSERT INTO t1 VALUES (1,1.11,2.22),(2,5.00,5.00); SELECT * FROM t1; ┌─uid─┬─amount1─┬─amount2─┐ │ 1 │ 10.00 │ 2.00 │ └─────┴─────────┴─────────┘ ┌─uid─┬─amount1─┬─amount2─┐ │ 1 │ 1.11 │ 2.22 │ │ 2 │ 5.00 │ 5.00 │ └─────┴─────────┴─────────┘ OPTIMIZE TABLE t1; SELECT * FROM t1; ┌─uid─┬─amount1─┬─amount2─┐ │ 1 │ 11.11 │ 2.00 │ │ 2 │ 5.00 │ 5.00 │ └─────┴─────────┴─────────┘
圖示amount1
會按照uid
聚合求和,而amount2
是第一條插入uid
時的值
注意
不能直接SELECT amount1 FROM t1 WHERE 維度
來得到彙總值,因為有些臨時明細資料還沒來得及聚合
所以仍要SELECT SUM(amount1)
INSERT
期間,表會被鎖定ENGINE = Log()
記憶體引擎
ENGINE = Memory()
到此這篇關於MySQL ClickHouse常用表引擎超詳細講解的文章就介紹到這了,更多相關MySQL ClickHouse內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45