如何选择StarRocks表类型

1,322 阅读6分钟

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 的更新操作
存储方式存储原始数据,适合海量数据存储聚合数据,减少存储空间存储最新的数据存储唯一数据,并通过主键索引优化查询
查询优化查询较为简单,但数据量大时性能会受影响查询聚合计算性能优越,减少计算成本查询性能较好,但可能有延迟查询性能非常高,适合高并发查询
使用场景日志数据、事件流、历史数据存储数据统计、实时分析、报表查询用户信息、产品信息、变化数据高并发查询、主键索引优化查询

选择建议

  • 明细表:适合存储重复数据,主要用于日志、事件流等。
  • 聚合表:适合频繁的聚合计算场景,减少聚合查询的延迟。
  • 更新表:适合存储需要频繁更新的唯一数据,如用户信息等。
  • 主键表:适合需要高性能查询的场景,特别是需要根据主键进行快速查询的情况。

根据数据的存储需求、查询性能要求以及是否有频繁更新的需求,可以选择合适的表类型。