18

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

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

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

select * from tablename where b=val;

结果是:

无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能。如果您想在性能不可预测的情况下执行此查询,请使用 ALLOW FILTERING

并且使用“允许过滤”可以得到我想要的东西(即使我听说它对性能不利)。

但是当我运行以下查询时:

select * from tablename where c=val;

它说:

PRIMARY KEY 列“c”不能被限制(前面的列“b”要么不受限制,要么受非 EQ 关系限制)

而且根本没有“允许过滤”选项。

我的问题是- 为什么所有集群键的处理方式不同?与分区键 'a' 相邻的 b 列有一个“允许过滤”选项,它允许查询它,而查询列 'c' 似乎根本不可能(考虑到该表的布局方式)。

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

4

1 回答 1

25

并不是集群键的处理方式不同,而是您不能跳过它们。这是因为 Cassandra 使用集群键来确定分区内的磁盘排序顺序。

要添加到您的示例,假设PRIMARY KEY ((a),b,c,d). 您可以通过仅指定b、 或b和来运行查询(使用 ALLOW FILTERING) c。但它不允许您指定cand d(skipping b) 或band d(skipping c)。

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

于 2015-05-27T18:31:38.443 回答