Database 同一分区中cassandra性能中的多个二级索引

Database 同一分区中cassandra性能中的多个二级索引,database,cassandra,Database,Cassandra,我有这样的桌子 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 pos

我有这样的桌子

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;
现在我查询的是具有二级索引的单个分区,如下所示

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),那么allow filtering是否会查询所有行或特定分区?性能将受到怎样的影响

如果这种情况会影响性能,请给出我如何处理这种情况的建议


谢谢。

因为提到了分区键,所以可以从一个分区中搜索具有的数据。这肯定比不提及分区键和只按辅助索引列查询(因为必须查询许多节点)更有效,但性能影响取决于您的数据集

允许筛选涉及数据筛选,因此可能具有不可预测的性能

在数据(特别是大型数据集)中进行过滤可能效率非常低,因此不可取。但这取决于它的效率有多低

如果您的分区太大(单个分区中的行太多),并且如果您对具有最唯一值的列进行筛选并筛选数据以获取小数据集,则效率低下,因为Cassandra会加载大数据并将其过滤掉

从主题为“cassandra”和国家为“india”的帖子中选择*

尽管您已经提到了分区键,但是这个查询是有效的

从主题为“cassandra”和国家为“india”且书签为“true”的帖子中选择*以允许过滤

在书签上添加索引可能会提高查询性能

然后,Cassandra将使用具有最高选择性的索引来查找需要加载的行。但是,它不会改变任何关于允许过滤的需要,因为它仍然必须使用剩余谓词过滤加载的行

请阅读下面的文章。我想它有你需要的答案:)

此外,非常高或非常低的基数上的二级索引是无效的。由于您在书签上有二级索引(数据类型为文本),但若值仅为“true”或“false”,则效率低下。

我有一个基于答案的后续问题。如果二级索引是低基数的(就像在我的例子中),并且分区很小(~200-500行),那么它也将是低效的?在您的例子中它不会是低效的。正如您提到的分区键,您没有那么大的数据集,可以使用它。