我刚刚开始使用 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 列呢?