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 的记录由版本号为 1
和 2
的两个批次加载,ID
为 2
的记录由版本号为 3
、4
和 5
的三个批次加载。
ID | value | _version |
---|---|---|
1 | 100 | 1 |
1 | 101 | 2 |
2 | 100 | 3 |
2 | 101 | 4 |
2 | 102 | 5 |
当您查询 ID
为 1
的记录时,会返回版本号最大的最新记录,在本例中为 2
。当您查询 ID
为 2
的记录时,会返回版本号最大的最新记录,在本例中为 5
。下表显示了两个查询返回的记录
ID | value |
---|---|
1 | 101 |
2 | 102 |
创建表
在电子商务场景中,您经常需要按日期收集和分析订单的状态。在本例中,创建一个名为 orders
的表来保存订单,将 create_time
和 order_id
(经常用作过滤订单的条件)定义为唯一键列,并将其他两列 order_state
和 total_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_time
、order_id
、order_state
和total_price
。 - 当您从使用 Unique Key 表的表中查询数据时,StarRocks 需要聚合多个数据版本中的记录。在这种情况下,大量的数据版本会降低查询性能。因此,我们建议您指定适当的数据加载频率到表中,以满足您对实时数据分析的需求,同时防止产生大量的数据版本。如果您需要分钟级别的数据,您可以指定 1 分钟的加载频率,而不是 1 秒的加载频率。