Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
cassandra上低基数列上的多个索引是如何工作的?_Cassandra_Cql_Cassandra 3.0_Cqlsh - Fatal编程技术网

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

cassandra上低基数列上的多个索引是如何工作的?,cassandra,cql,cassandra-3.0,cqlsh,Cassandra,Cql,Cassandra 3.0,Cqlsh,我正在尝试在我的Cassandra数据存储上创建多个索引。 我的模式如下 id: integer primary key field1: text field2: text field3: text field4: int select * from mykeyspace.mytable where field1='filter1' and field2='filter2' allow filtering; 我在不同的列上创建多个索引 CREATE INDEX filed1_index ON

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

id: integer primary key
field1: text
field2: text
field3: text
field4: int
select * from mykeyspace.mytable where field1='filter1' and field2='filter2' allow filtering;
我在不同的列上创建多个索引

CREATE INDEX filed1_index ON mykeyspace.mytable ( field1 );
CREATE INDEX filed2_index ON mykeyspace.mytable ( field2 );
CREATE INDEX filed4_index ON mykeyspace.mytable ( field4 );
现在,我尝试按如下方式查询数据

id: integer primary key
field1: text
field2: text
field3: text
field4: int
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;
这是一篇讨论同样问题的好文章。此外,关于辅助索引的任何回答都不完整,除非提及始终使用辅助索引和分区键以获得最大效率