テーブルエンジン(つまり、テーブルの種類)によって、次のことが決まります。
- データの保存方法と場所、データの書き込み場所と読み取り場所
- サポートされるクエリとその方法。
- 同時データアクセス。
- インデックスの使用(ある場合)。
- マルチスレッド要求を実行できるかどうか。
- データ複製パラメーター。
読み取り時には、エンジンは要求された列を出力するだけで済みますが、場合によっては、エンジンは要求に応じてデータを部分的に処理できます。ほとんどの正式なタスクでは、MergeTreeファミリーのエンジンを使用する必要があります。
1ログエンジン
最小限の機能を備えた軽量エンジン。このタイプのエンジンは、多くの小さなテーブル(最大約100万行)にすばやく書き込み、後で全体として読み取る必要がある場合に最も効果的です。
1.1 TinyLogエンジン(データは高速ではありません)
1.2 StripeLog
1.3ログ
2 MergeTreeエンジン
2.1 MergeTree()
2.2 MergeTreeの置き換え
2.3 SummingMergeTreeエンジン
データパーティション内の指定されたフィールドを、累積のために同じ主キーと組み合わせる
- テーブルを作成する
create table tb_summ_merge_tree(
id Int8 ,
name String ,
ctime Date ,
cost UInt8
)
engine=SummingMergeTree(cost)
order by id
partition by name
primary key id;
- データを挿入する
insert into tb_summ_merge_tree values (1, 'a','2020-08-05', 20);
insert into tb_summ_merge_tree values (1, 'b','2020-08-05', 30);
insert into tb_summ_merge_tree values (1, 'a','2020-08-05', 20);
insert into tb_summ_merge_tree values (1, 'a','2020-08-05', 30);
insert into tb_summ_merge_tree values (1, 'b','2020-08-05', 10);
- データのクエリ
SELECT *
FROM tb_summ_merge_tree
┌─id─┬─name─┬──────ctime─┬─cost─┐
│ 1 │ a │ 2020-08-05 │ 20 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│ 1 │ b │ 2020-08-05 │ 30 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│ 1 │ a │ 2020-08-05 │ 20 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│ 1 │ b │ 2020-08-05 │ 10 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│ 1 │ a │ 2020-08-05 │ 30 │
└────┴──────┴────────────┴──────┘
- テーブルの結合、パーティションのマージ->領域内の重複する主キーを削除、累積するフィールドを指定
doit01 :) optimize table tb_summ_merge_tree ; -- 合并数据
┌─id─┬─name─┬──────ctime─┬─cost─┐
│ 1 │ b │ 2020-08-05 │ 30 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│ 1 │ b │ 2020-08-05 │ 10 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│ 1 │ a │ 2020-08-05 │ 70 │----****
└────┴──────┴────────────┴──────┘
doit01 :) optimize table tb_summ_merge_tree ;
┌─id─┬─name─┬──────ctime─┬─cost─┐
│ 1 │ a │ 2020-08-05 │ 70 │
└────┴──────┴────────────┴──────┘
┌─id─┬─name─┬──────ctime─┬─cost─┐
│ 1 │ b │ 2020-08-05 │ 40 │
└────┴──────┴────────────┴──────┘
2.4 CollapsingMergeTree
ClickHouseはCollapsingMergeTreeを実装して、ReplaceingMergeTree(マイナーバージョンフィールドのみを削除する問題)の制限を排除します。エンジンでは、テーブル作成ステートメントでタグ列Signを指定する必要があります。主キーは同じであるがSignが反対の行は、バックグラウンドでの圧縮中に折りたたまれる、つまり削除されます。
CollapsingMergeTreeは、同じ主キーを持つデータの即時削除の問題を解決しますが、状態が変化し続け、マルチスレッドの並列書き込みが行われると、ステータス行とキャンセル行の位置が狂って、通常の折りたたみに失敗する場合があります。古いステータスラインがキャンセルラインの上にあり、新しいステータスラインがキャンセルラインの下にあることを確認してください!ただし、マルチスレッドでは書き込みの順序を保証できません。
- テーブルを作成する
CREATE TABLE tb_cps_merge_tree
(
uid UInt64,
name String,
age UInt8,
sign Int8
)
ENGINE = CollapsingMergeTree(sign)
ORDER BY user_id;
データを挿入する
INSERT INTO tb_cps_merge_tree VALUES (1001,'ADA', 18, 1);
INSERT INTO tb_cps_merge_tree VALUES (1001,'ADA', 19, -1);
INSERT INTO tb_cps_merge_tree VALUES (1001,'ADA', 20, 1);
INSERT INTO tb_cps_merge_tree VALUES (1002,'zss', 21, -1);
INSERT INTO tb_cps_merge_tree VALUES (1002,'zss', 19, 1);
INSERT INTO tb_cps_merge_tree VALUES (1004,'lss', 19, 1);
INSERT INTO tb_cps_merge_tree VALUES (1004,'lss', 29, 1);
INSERT INTO tb_cps_merge_tree VALUES (1004,'lss', 39, 1);
INSERT INTO tb_cps_merge_tree VALUES (1004,'lss', 49, 1);
INSERT INTO tb_cps_merge_tree VALUES (1004,'lss', 21, -1);
INSERT INTO tb_cps_merge_tree VALUES (1005,'lss', 19, 1);
INSERT INTO tb_cps_merge_tree VALUES (1005,'lss', 59, 1);
INSERT INTO tb_cps_merge_tree VALUES (1005,'lss', 21, -1);
INSERT INTO tb_cps_merge_tree VALUES (1005,'lss', 39, 1);
INSERT INTO tb_cps_merge_tree VALUES (1005,'lss', 49, 1);
INSERT INTO tb_cps_merge_tree VALUES (1006,'lss', 59, 1);
INSERT INTO tb_cps_merge_tree VALUES (1006,'lss', 29, 1);
INSERT INTO tb_cps_merge_tree VALUES (1006,'lss', 21, -1);
INSERT INTO tb_cps_merge_tree VALUES (1006,'lss', 39, 1);
INSERT INTO tb_cps_merge_tree VALUES (1006,'lss', 49, 1);
2.5 VersionedCollapsingMergeTree
取り消された行データを削除できないという問題を回避するために、同僚によるフィールドとデータバージョンの使用を取り消します
CollapsingMergeTreeが順不同で書き込まれると正常に折りたたむことができないという問題を解決するために、 VersionedCollapsingMergeTreeテーブルエンジンは、テーブル作成ステートメントにVersionの新しい列を追加します。これは、順不同の場合にステータス行とキャンセル行の間の対応を記録するために使用されます。同じ主キー、同じバージョン、および反対の符号を持つ行は、圧縮中に削除されます。
CollapsingMergeTreeと同様に、ビジネスレイヤーは正しい結果を取得するために、SQLを書き換え、count()とsum(col)をそれぞれsum(Sign)とsum(col * Sign)に書き換える必要があります。
CREATE TABLE tb_vscmt
(
uid UInt64,
name String,
age UInt8,
sign Int8,
version UInt8
)
ENGINE = VersionedCollapsingMergeTree(sign, version)
ORDER BY uid;
INSERT INTO tb_vscmt VALUES (1001, 'ADA', 18, -1, 1);
INSERT INTO tb_vscmt VALUES (1001, 'ADA', 18, 1, 1),(101, 'DAD', 19, 1, 2);(101, 'DAD', 11, 1, 3);
INSERT INTO tb_vscmt VALUES(101, 'DAD', 11, 1, 3) ;