我正在尝试在我的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;
这是一篇讨论同样事情的好文章。此外,任何关于二级索引的答案都是不完整的,除非提到始终使用二级索引和分区键以获得最大效率。