StarRocks 支持四种主要的表类型:明细表(Duplicate Key Table)、聚合表(Aggregate Table)、更新表(Unique Key Table)和主键表(Primary Key Table)。每种表类型的设计和适用场景不同,下面详细解析这四种表类型的特点、区别及使用场景。
1. 明细表(Duplicate Key Table)
-
表结构特点:
- 适用于保存重复数据的场景。允许在同一表中存储相同的
KEY值,数据可能会重复。 - 这种表在数据存储时,不进行去重操作,即使数据的
KEY值相同,仍然会按原样保存。 - 数据是基于一个
KEY(例如某个列或一组列)来分区和存储的。
- 适用于保存重复数据的场景。允许在同一表中存储相同的
-
使用场景:
- 适用于日志数据、明细数据、事件流等场景,尤其是数据中允许重复并且需要记录完整历史数据的场景。
- 在这种表中,如果你需要记录同一任务、事件或消息的多个版本或多次处理结果,可以使用明细表。
-
特点:
- 允许数据重复:同一个主键值的数据可以多次插入。
- 适合实时插入大量数据。
- 查询时不会对重复数据进行去重,查询性能较高,尤其是针对最近的插入数据。
-
例子:
CREATE TABLE duplicate_key_table ( `id` INT, `name` VARCHAR(255), `amount` DOUBLE ) ENGINE=OLAP DUPLICATE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 10;
2. 聚合表(Aggregate Table)
-
表结构特点:
- 聚合表专门用于存储经常需要做聚合查询的数据。它的设计目的是通过预先计算聚合结果来提升查询性能。
- 聚合表会在插入数据时根据指定的聚合规则(如 SUM、AVG、MAX 等)自动聚合数据,存储聚合结果而不是原始数据。
- 聚合表支持按时间、维度等进行数据分区和聚合操作。
-
使用场景:
- 适合于大规模的聚合查询,如实时统计、报表等,尤其是常见的
GROUP BY聚合查询场景。 - 适用于需要高效处理大量聚合查询的数据,减少计算开销,提高查询效率。
- 适合于大规模的聚合查询,如实时统计、报表等,尤其是常见的
-
特点:
- 聚合数据:对于相同的
KEY,存储的是聚合后的结果。 - 查询效率高:对经常进行聚合的查询提供优化,可以显著减少计算量。
- 数据更新方式:适合数据量较大且频繁进行计算和查询的场景。
- 聚合数据:对于相同的
-
例子:
CREATE TABLE aggregate_table ( `id` INT, `amount` DOUBLE, `timestamp` DATETIME ) ENGINE=OLAP AGGREGATE KEY(`id`, `timestamp`) PARTITION BY RANGE(`timestamp`) ( PARTITION p1 VALUES LESS THAN ('2023-01-01'), PARTITION p2 VALUES LESS THAN ('2024-01-01') );
3. 更新表(Unique Key Table)
-
表结构特点:
- 更新表用于数据有唯一标识的情况,并且对数据进行更新操作时,确保每个
KEY只有一条记录。即,如果插入的数据中存在与已有数据相同的KEY,则会执行更新操作而不是插入新数据。 - 这种表采用了唯一键约束,保证每个
KEY值在表中只存在一条记录。 - 适用于存储那些需要保持最新数据状态的场景,如用户信息、产品信息等。
- 更新表用于数据有唯一标识的情况,并且对数据进行更新操作时,确保每个
-
使用场景:
- 适用于需要存储唯一数据并且能够根据
KEY进行更新操作的场景。 - 在数据有变化时,需要更新数据而不是插入新记录的应用场景。
- 适用于需要存储唯一数据并且能够根据
-
特点:
- 保证数据唯一:每个
KEY对应一条数据。 - 更新操作:如果插入的
KEY已存在,会执行更新操作,保持数据的最新状态。 - 查询时,数据的一致性更好,但可能会有写入延迟。
- 保证数据唯一:每个
-
例子:
CREATE TABLE unique_key_table ( `id` INT, `name` VARCHAR(255), `amount` DOUBLE ) ENGINE=OLAP UNIQUE KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 10;
4. 主键表(Primary Key Table)
-
表结构特点:
- 主键表与更新表类似,也要求数据的主键唯一,但它不仅仅保证
KEY的唯一性,还通过主键索引优化查询性能。 - 主键表是 StarRocks 中一个常见的高性能表类型,适合需要高效索引查询的场景。
- 数据按主键进行分区,具有较高的查询性能,特别是在进行范围查询时。
- 主键表与更新表类似,也要求数据的主键唯一,但它不仅仅保证
-
使用场景:
- 适合需要高效读取、根据主键进行频繁查询的应用场景。
- 适用于要求数据唯一、且主键查询性能要求较高的场景。
-
特点:
- 唯一主键:每个
KEY必须唯一。 - 索引优化:通过主键索引加速查询,特别是对于范围查询、精确查询等场景。
- 查询性能优秀,特别是对于主键或索引字段的查询。
- 唯一主键:每个
-
例子:
CREATE TABLE primary_key_table ( `id` INT, `name` VARCHAR(255), `amount` DOUBLE ) ENGINE=OLAP PRIMARY KEY(`id`) DISTRIBUTED BY HASH(`id`) BUCKETS 10;
四种表类型的区别与选择
| 特性 | 明细表(Duplicate Key Table) | 聚合表(Aggregate Table) | 更新表(Unique Key Table) | 主键表(Primary Key Table) |
|---|---|---|---|---|
| 数据唯一性 | 允许数据重复 | 聚合数据,不存储重复项 | 每个 KEY 只存一条记录 | 每个 KEY 只存一条记录 |
| 更新操作 | 不支持更新,仅追加数据 | 预聚合数据,不能直接更新 | 支持基于 KEY 的更新操作 | 支持基于 KEY 的更新操作 |
| 存储方式 | 存储原始数据,适合海量数据存储 | 聚合数据,减少存储空间 | 存储最新的数据 | 存储唯一数据,并通过主键索引优化查询 |
| 查询优化 | 查询较为简单,但数据量大时性能会受影响 | 查询聚合计算性能优越,减少计算成本 | 查询性能较好,但可能有延迟 | 查询性能非常高,适合高并发查询 |
| 使用场景 | 日志数据、事件流、历史数据存储 | 数据统计、实时分析、报表查询 | 用户信息、产品信息、变化数据 | 高并发查询、主键索引优化查询 |
选择建议
- 明细表:适合存储重复数据,主要用于日志、事件流等。
- 聚合表:适合频繁的聚合计算场景,减少聚合查询的延迟。
- 更新表:适合存储需要频繁更新的唯一数据,如用户信息等。
- 主键表:适合需要高性能查询的场景,特别是需要根据主键进行快速查询的情况。
根据数据的存储需求、查询性能要求以及是否有频繁更新的需求,可以选择合适的表类型。