cassandra上低基数列上的多个索引是如何工作的



我正在尝试在我的Cassandra数据存储中创建多个索引。我的模式如下

id: integer primary key
field1: text
field2: text
field3: text
field4: int

我在不同的列上创建多个索引

CREATE INDEX filed1_index ON mykeyspace.mytable ( field1 );
CREATE INDEX filed2_index ON mykeyspace.mytable ( field2 );
CREATE INDEX filed4_index ON mykeyspace.mytable ( field4 );

现在我试着查询下面的数据

select * from mykeyspace.mytable where field1='filter1' and field2='filter2' allow filtering;

根据关于使用多个索引的文档,我无法确定是否使用了我在上面创建的索引?任何指示或解释都会非常有用。

当您在Cassandra中创建二级索引时,Cassandra本质上会为其创建相应的隐藏表。

所以在你的情况下,你会有3个隐藏的表

CREATE TABLE field1_index(
field1 text,
key integer
PRIMARY KEY ((field1), key) );   
CREATE TABLE field2_index(
field2 text,
key integer
PRIMARY KEY ((field2), key) );   
CREATE TABLE field3_index(
field3 text,
key integer
PRIMARY KEY ((field3), key) );

这些表是节点的本地表,因此只有存储在该特定节点中的数据才会被索引。

当有多个索引时,Cassandra使用具有最高选择性的索引来查找需要加载的行。一旦选择了最高选择性索引,其余谓词将正常过滤。

因此,对于查询执行,只能使用一个索引,其余索引将正常过滤。你可以通过观察看到这一点

这些查询不需要允许过滤

select * from mykeyspace.mytable where field1='filter1';
select * from mykeyspace.mytable where field2='filter2';

但是同时具有两个索引的查询会进行

select * from mykeyspace.mytable where field1='filter1' and field2='filter2' allow filtering;

这是一篇讨论同样事情的好文章。此外,任何关于二级索引的答案都是不完整的,除非提到始终使用二级索引和分区键以获得最大效率。

最新更新