Cassandra - 查询集群键

Cassandra - querying on clustering keys

我刚刚开始使用 Cassandra,我试图创建具有不同分区和集群键的 tables 以查看如何以不同方式查询它们。

我创建了一个 table,其主键的形式为 - (a),b,c,其中 a 是分区键,b,c 是集群键。

查询时我注意到以下查询:

select * from tablename where b=val;

结果:

Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING

并且使用 "ALLOW FILTERING" 得到了我想要的东西(尽管我听说它对性能不利)。

但是当我运行下面的查询时:

select * from tablename where c=val;

它说:

PRIMARY KEY column "c" cannot be restricted (preceding column "b" is either not restricted or by a non-EQ relation)

而且根本没有 "ALLOW FILTERING" 选项。

我的问题是 - 为什么所有集群键的处理方式不同?与分区键 'a' 相邻的列 b 被赋予 'allow filtering' 选项,这允许在查询列 'c' 时对其进行查询似乎根本不可能(考虑到此 table 已布局)。

ALLOW FILTERING 让 cassandra 扫描所有 SSTables 并在分区键丢失时从中获取数据,那为什么我们不能做相同的列 c?

并不是聚类键不被同等对待,而是你不能跳过它们。这是因为 Cassandra 使用集群键来确定分区内的磁盘排序顺序。

要添加到您的示例中,假设 PRIMARY KEY ((a),b,c,d)。您可以通过仅指定 bbc 来 运行 您的查询(使用 ALLOW FILTERING)。但它不允许您指定 cd(跳过 b)或 bd(跳过 c)。

并且作为一个侧节点,如果您真的希望能够仅通过 b 或仅通过 c 进行查询,那么您应该使用这样设计的附加表来支持这些查询。 ALLOW FILTERING 是一种创可贴,不是您在生产 Cassandra 部署中应该做的事情。