我如何 select cassandra 中聚类列的所有行?
How do I select all rows for a clustering column in cassandra?
我有一个分区密钥:A
集群列:B、C
我明白我可以这样查询
Select * from table where A = ?
Select * from table where A = ? and B = ?
Select * from table where A = ? and B = ? and C = ?
在某些情况下,我希望 B 值是该列中的任何值。
有没有办法像下面这样查询?
Select * from table where A = ? and B = 'any value' and C = ?
选项 1:
在 Cassandra 中,您应该设计适合您的查询的数据模型。因此,支持第四个查询(通过 A 和 C 查询,但不一定知道 B 值)的正确方法是创建一个新的 table 来处理该特定查询。 table 几乎相同,只是 CLUSTERING COLUMNS 的顺序略有不同:
PRIMARY KEY (A, C, B)
现在这个查询可以工作了:
Select * from table where A = ? and C = ?
选项 2:
或者,您可以创建具有不同集群顺序的实体化视图。现在 Cassandra 将使 MV 与您的 table 数据保持同步。
create materialized view mv_acbd as
select A, B, C, D
from TABLE1
where A is not null and B is not null and C is not null
primary key (A, C, B);
现在针对此 MV 的查询将非常有效
Select * from mv_acbd where A = ? and C = ?
选项 3:
不是最好的,但您可以将以下查询与您的 table 一起使用
Select * from table where A = ? and C = ? ALLOW FILTERING
依赖 ALLOW FILTERING 从来都不是一个好主意,当然也不应该在生产集群中这样做。对于这种特殊情况,扫描在同一个分区内,性能可能会有所不同,具体取决于您的用例每个分区的聚类列数的比率。
我有一个分区密钥:A
集群列:B、C
我明白我可以这样查询
Select * from table where A = ?
Select * from table where A = ? and B = ?
Select * from table where A = ? and B = ? and C = ?
在某些情况下,我希望 B 值是该列中的任何值。
有没有办法像下面这样查询?
Select * from table where A = ? and B = 'any value' and C = ?
选项 1:
在 Cassandra 中,您应该设计适合您的查询的数据模型。因此,支持第四个查询(通过 A 和 C 查询,但不一定知道 B 值)的正确方法是创建一个新的 table 来处理该特定查询。 table 几乎相同,只是 CLUSTERING COLUMNS 的顺序略有不同:
PRIMARY KEY (A, C, B)
现在这个查询可以工作了:
Select * from table where A = ? and C = ?
选项 2:
或者,您可以创建具有不同集群顺序的实体化视图。现在 Cassandra 将使 MV 与您的 table 数据保持同步。
create materialized view mv_acbd as
select A, B, C, D
from TABLE1
where A is not null and B is not null and C is not null
primary key (A, C, B);
现在针对此 MV 的查询将非常有效
Select * from mv_acbd where A = ? and C = ?
选项 3:
不是最好的,但您可以将以下查询与您的 table 一起使用
Select * from table where A = ? and C = ? ALLOW FILTERING
依赖 ALLOW FILTERING 从来都不是一个好主意,当然也不应该在生产集群中这样做。对于这种特殊情况,扫描在同一个分区内,性能可能会有所不同,具体取决于您的用例每个分区的聚类列数的比率。