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

ma8fv8wu  于 2021-06-13  发布在  Cassandra
关注(0)|答案(1)|浏览(407)

我正在尝试在我的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;

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

vlju58qv

vlju58qv1#

当您在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使用具有最高选择性的索引来查找需要加载的行。一旦选择了最高的选择性索引,其余的 predicate 就会被正常过滤。
因此,对于查询执行,只能使用一个索引,其余索引将正常过滤。你可以通过观察
这些查询不需要允许筛选

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;

这是一篇讨论同样问题的好文章。另外,关于二级索引的任何回答都不完整,除非提到始终将二级索引与分区键一起使用以获得最大效率。

相关问题