我有这样的表格。
CREATE TABLE posts (
topic text
country text,
bookmarked text,
id uuid,
PRIMARY KEY (topic,id)
);
之后我在国家/地区创建了二级索引并添加了书签,如下所示。
CREATE INDEX posts_country ON posts (country);
CREATE INDEX posts_bookmarked ON posts (bookmarked);
现在我正在使用二级索引查询单个分区,如下所示。
select * from posts where topic='cassandra' and country='india' and bookmarked='true' allow filtering;
select * from posts where topic='sql' and country='us' and bookmarked='true' allow filtering;
我的问题是,如果所有查询都转到同一个分区(topic = cassandra或topic = sql)那么允许过滤会查询所有行还是特定分区?性能如何受到影响?
如果影响性能,我会如何处理这种情况。
感谢。
答案 0 :(得分:1)
当提到分区键时,可以从一个分区搜索数据。它肯定比没有提到分区键有效,只有二级索引列查询(必须查询许多节点)但性能影响取决于您的数据集。
允许过滤涉及数据过滤,因此可能具有不可预测的性能。
过滤数据(特别是大型数据集)可能效率非常低,因此不可取。但这取决于它的效率如何。
如果您的分区太大(单个分区中的行太多),并且您在具有最独特值的列上进行过滤,并且过滤数据以获取小数据集效率不高,则Cassandra会加载大量数据和过滤器他们出去了。
从帖子中选择*,其中topic =' cassandra'和国家='印度';
虽然您提到了分区键,但此查询仍然有效。
从帖子中选择*,其中topic =' cassandra'和国家='印度'和bookmarked =' true'允许过滤;
在bookmarked上添加索引可能会提高查询性能。
然后,Cassandra将使用具有最高选择性的索引来查找需要加载的行。但是,它不会改变任何有关ALLOW FILTERING的需要,因为它仍然需要使用剩余的谓词来过滤加载的行。
请阅读以下文章。我认为它有你需要的答案我猜:) https://www.datastax.com/dev/blog/allow-filtering-explained-2
此外,非常高或低基数的二级索引效率不高。因为你有书签的二级索引(数据类型是文本),但如果值只是'真'或者' false'它效率不高。 https://docs.datastax.com/en/cql/3.3/cql/cql_using/useWhenIndex.html