跳到主要内容
版本: 最新版本-3.5

Unique Key 表

Unique Key 表需要在建表时指定唯一键。当多行数据具有相同的唯一键时,Value 列的值会被替换。查询时,返回具有相同唯一键的数据组中的最新数据。此外,您可以单独定义排序键。如果查询中的过滤条件包含排序键,StarRocks 可以快速过滤数据,提高查询效率。

Unique Key 表可以支持实时和频繁的数据更新。但是,它正在逐渐被 Primary Key 表所取代。

使用场景

Unique Key 表适用于需要频繁实时更新数据的业务场景。例如,在电子商务场景中,每天可以产生数亿个订单,并且订单的状态经常变化。

原理

Unique Key 表可以被认为是一种特殊的 Aggregate 表,其中为 Value 列指定了 REPLACE 聚合函数,以返回具有相同唯一键的一组记录中的最新记录。

当您将数据加载到 Unique Key 表中时,数据会被分成多个批次。每个批次都会被分配一个版本号。因此,具有相同唯一键的记录可能包含在多个版本中。查询时,会返回最新版本中的数据(即版本号最大的记录)。

如下表所示,ID 是唯一键,value 是 Value 列,_version 保存了 StarRocks 中生成的数据版本号。在本例中,ID 为 1 的记录由版本号为 12 的两个批次加载,ID2 的记录由版本号为 345 的三个批次加载。

IDvalue_version
11001
11012
21003
21014
21025

当您查询 ID1 的记录时,会返回版本号最大的最新记录,在本例中为 2。当您查询 ID2 的记录时,会返回版本号最大的最新记录,在本例中为 5。下表显示了两个查询返回的记录

IDvalue
1101
2102

创建表

在电子商务场景中,您经常需要按日期收集和分析订单的状态。在本例中,创建一个名为 orders 的表来保存订单,将 create_timeorder_id(经常用作过滤订单的条件)定义为唯一键列,并将其他两列 order_statetotal_price 定义为 Value 列。这样,订单可以随着状态的变化进行实时更新,并且可以快速过滤以加速查询。

创建表的语句如下

CREATE TABLE orders (
create_time DATE NOT NULL COMMENT "create time of an order",
order_id BIGINT NOT NULL COMMENT "id of an order",
order_state INT COMMENT "state of an order",
total_price BIGINT COMMENT "price of an order"
)
UNIQUE KEY(create_time, order_id)
DISTRIBUTED BY HASH(order_id);

注意

  • 创建表时,必须使用 DISTRIBUTED BY HASH 子句指定分桶列。有关详细信息,请参见 分桶
  • 自 v2.5.7 起,StarRocks 可以在创建表或添加分区时自动设置 Bucket 数量 (BUCKETS)。您不再需要手动设置 Bucket 数量。有关详细信息,请参见 设置 Bucket 数量

使用说明

  • Unique Key:

    • 在 CREATE TABLE 语句中,唯一键必须在其他列之前定义。
    • 唯一键需要使用 UNIQUE KEY 显式定义。
    • 唯一键具有唯一性约束。
  • Sort Key:

    • 自 v3.3.0 起,排序键已与 Unique Key 表中的唯一键分离。Unique Key 表支持使用 ORDER BY 指定排序键,并使用 UNIQUE KEY 指定唯一键。排序键和唯一键中的列需要相同,但列的顺序不需要相同。

    • 在查询期间,可以在聚合之前基于排序键过滤数据。但是,可以在多版本聚合之后基于 Value 列过滤数据。因此,建议使用经常过滤的字段作为排序键,以便在聚合之前过滤数据,从而提高查询性能。

  • 创建表时,只能在表的 Key 列上创建 Bitmap 索引或 Bloom Filter 索引。

下一步做什么

创建表后,您可以使用各种数据摄取方法将数据加载到 StarRocks 中。有关 StarRocks 支持的数据摄取方法的信息,请参阅加载选项

注意
  • 当您将数据加载到使用 Unique Key 表的表中时,您只能更新表的所有列。例如,当您更新前面的 orders 表时,您必须更新其所有列,即 create_timeorder_idorder_statetotal_price
  • 当您从使用 Unique Key 表的表中查询数据时,StarRocks 需要聚合多个数据版本中的记录。在这种情况下,大量的数据版本会降低查询性能。因此,我们建议您指定适当的数据加载频率到表中,以满足您对实时数据分析的需求,同时防止产生大量的数据版本。如果您需要分钟级别的数据,您可以指定 1 分钟的加载频率,而不是 1 秒的加载频率。