本文共 2592 字,大约阅读时间需要 8 分钟。
CollapsingMergeTree是一种基于增删思想的表引擎,它支持行级数据的修改和删除操作。其核心原理是通过定义一个sign标记位字段来控制数据的存活状态。具体来说,当sign标记为1时,表示该行数据为有效数据;当sign标记为-1时,表示该行数据需要被删除。
CollapsingMergeTree引擎的建表语法如下:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ...) ENGINE = CollapsingMergeTree(sign) [PARTITION BY expr][ORDER BY expr][SAMPLE BY expr][SETTINGS name=value, ...]
Incremental Delete:引擎通过sign字段的作用机制,支持数据的增删操作。当需要删除一条记录时,只需在同一记录基础上修改sign字段为-1即可。此外,新增有效数据时,应插入一条sign字段为1的记录。
分区合并机制:当发生分区合并时,引擎会根据分区内的sign标记进行合并操作。同一分区内,sign标记为1和-1的数据会被抵消删除。这一机制需要在后台进行Compaction操作,或者在特定情况下由用户手动触发优化操作。
适用场景:该引擎特别适用于对数据写入顺序有一定要求的场景。它依赖于写入数据的顺序来完成折叠操作。如果需要处理大量数据或有多线程写入的情况,建议使用VersionedCollapsingMergeTree引擎。
为了应对数据写入乱序的情况,VersionedCollapsingMergeTree引擎提供了一个额外的version字段。它与CollapsingMergeTree引擎的主要区别在于,Versioned引擎不再对写入数据的顺序产生依赖。
VersionedCollapsingMergeTree引擎的建表语法如下:
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster] ( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2], ... version UInt8) ENGINE = VersionedCollapsingMergeTree(sign, version) [PARTITION BY expr][ORDER BY expr][SAMPLE BY expr][SETTINGS name=value, ...]
sign:与CollapsingMergeTree引擎相同,用于标记数据的存活状态。version: UInt8类型的字段,用于跟踪数据的版本信息。Versioned引擎会根据version字段进行排序,从而确保数据的折叠操作能够正确执行。以下是一个使用VersionedCollapsingMergeTree引擎的示例:
INSERT INTO emp_versioned VALUES (1, 'tom', '上海', 25, '技术部', 20000, -1, 1);
INSERT INTO emp_versioned VALUES (1, 'tom', '上海', 25, '技术部', 20000, 1, 1);
INSERT INTO emp_versioned VALUES (1, 'tom', '上海', 25, '技术部', 30000, 1, 2);
在插入新数据后,执行优化操作并查询表:
OPTIMIZE TABLE emp_versioned;
执行优化操作后,sign为1和-1的数据会被自动折叠,结果如下:
SELECT * FROM emp_versioned;┌─emp_id─┬─name─┬─work_place─┬─age─┬─depart─┬───salary─┬─sign─┬─version─┐│ 1 │ tom │ 上海 │ 25 │ 技术部 │ 30000.00 │ 1 │ 2 │└────────┴──────┴────────────┘
分区合并:分区合并操作通常需要后台Compaction来优化数据体积。手动执行合并操作可能会显著影响性能,因此在生产环境中不建议手动操作。
数据折叠:Versioned引擎通过version字段实现了对数据写入顺序的无依赖性。它会自动将version字段纳入排序逻辑,确保数据的准确折叠。
查询优化:在进行数据汇总操作时,建议通过合理的查询策略过滤出sign为1的数据。如下所示:
SELECT emp_id, name, sum(salary * sign) FROM emp_versionedGROUP BY emp_id, nameHAVING sum(sign) > 0;
CollapsingMergeTree和VersionedCollapsingMergeTree引擎为 coprocessor 型键存储引擎提供了强大的数据管理能力。CollapsingMergeTree引擎依赖于数据的写入顺序,而VersionedCollapsingMergeTree引擎则通过引入version字段实现了对写入顺序的无关性。无论是哪种引擎,都通过智能的折叠机制确保数据的高效管理和查询。
转载地址:http://wrsmz.baihongyu.com/