我只有一张桌子
CREATE TABLE user (
p1 int,
p2 int,
created_at timestamp,
user_name text,
c1 text,
PRIMARY KEY ((p1, p2),name)
) WITH additional_write_policy = '99p';
如果我运行查询会发生什么
select * from user where p1 = 1 and p2 = 1 and name = 'abc' allow filtering;
将允许过滤在这里工作,或者它在查询中只是多余的。
我发现列名称和主键+查询之间存在一些不一致 - 我假设
user_name
和 name
在我的答案中是一回事。
由于您是按主键列进行过滤,因此
ALLOW FILTERING
是多余的。当您按分区键和(可选)集群列进行过滤时,协调器将知道哪些副本存储数据,并且每个联系的副本将通过本地索引推断数据在存储级别存储的位置,从而使其成为高效的 Cassandra 读取查询。
相反,当
ALLOW FILTERING
查询不按分区键的所有项进行过滤,和/或按非主键列进行过滤时,本地副本索引和/或全局索引将变得无用,从而使得大量副本扫描其完整数据集并在读取后进行过滤 - 因此效率低下。
ALLOW FILTERING
选项的目的是例外地允许需要完整扫描的查询,因为由于影响风险,这种类型的查询默认会失败,作为一种保护措施。
一些基础知识:永远不要在读取查询中使用
ALLOW FILTERING
,因为这是一种不好的做法,原因如下,
话虽如此,在这种情况下可能没问题,因为您已经在此处提供了表的完整主键 [分区键 + 集群键],并且对于 AF 来说这是无操作的。