Cassandra - 在集群列上使用 IN 运算符更新 table

Cassandra - update table using IN operator on a clustering column

我有以下 table
CREATE TABLE group ( tenant_id uuid, group_id uuid, display_name text, group_members set<uuid>, mail text, user_members set<uuid>, PRIMARY KEY (tenant_id, group_id) )
我想更新 group_members 字段并执行以下语句:

UPDATE group SET group_members = group_members - {7c796908-8c03-4b5d-afd1-4263dc1e469c} WHERE tenant_id = ac0d32ce-786f-4bfc-9b14-88008be2d19a AND group_id in (1ab11837-656a-463f-b7eb-2cbd1a178e49, aa18d888-8e5e-410f-8a67-ca2cb0e4e92c, 0fecc4c5-f49b-412e-b248-1b7c816a49c8)
我知道不建议在分区键上使用 IN 运算符,因为它会导致在多个节点上执行查询。但在这里我提供了分区键,所以我看不出这会导致性能问题。

我的问题如下:

1.这个查询是否在持有数据的节点上执行一次?或者它是否执行了 3 次 - IN 运算符中的每个 group_id 值执行一次?

2. 是否有更好的方法(性能方面)来完成此更新?
3. 我试图 运行 这个查询而不在 WHERE 子句中提供 group_id 但这导致了以下错误

InvalidRequest: Error from server: code=2200 [Invalid query] message="Some clustering keys are missing: group_id"

为什么会出现这个错误?

1.此查询是否在保存数据的节点上执行一次?或者它执行了 3 次 - IN 运算符中的每个 group_id 值执行一次?

由于查询是针对单个分区键进行匹配的,因此它仅在属于具有此数据的节点中执行。希望负载平衡策略是 TokenAware 并且一致性是 1 或 local_quorum。 此更新查询也只执行一次,因为单个目标分区键。请记住 Cassandra 是仅附加系统,在 writes/updates 之前没有读取,因此这些更新本质上是附加到新的 SSTable 并且生活是美好的:)

2。有没有更好的方法(性能方面)来完成此更新?

只要更新语句不影响多个分区,就应该没问题。此外,我们只讨论了三个 "group_id" 列值,此查询应该可以正常工作。如果 IN 查询倾向于增长到三位数,比如 100 个集群列值,那么您将开始看到读取此分区键期间的延迟影响。

3。我试图 运行 这个查询而不在 WHERE 子句中提供 group_id 但这导致了以下错误 InvalidRequest:来自服务器的错误:code=2200 [无效查询] message="Some clustering keys are missing: group_id" 为什么会出现这个错误?

该错误实质上表明您无法仅使用分区列来更新行。因为它不知道要应用写入的所有聚类列是什么。

对于给定的分区键,可能有 1000 多个集群列。因此,如果没有限定聚簇列,Cassandra 将不知道分区键中的哪一行受到影响,哪些行没有受到影响。