Cassandra - 在具有许多唯一值的多列上建立索引

时间:2014-10-01 17:47:31

标签: java cassandra database nosql

我目前有一个列系列,我想在多列上编制索引。我目前正在考虑使用的架构是:

CREATE TABLE keyspace.cfname (
    row_key uuid,
    ts timestamp,
    some_field_a blob,
    some_field_b blob,
    some_field_c text,
    some_field_d int,
    PRIMARY KEY ((row_key))
);

对于我想要索引的每个字段,我创建了一个DIY索引:

CREATE TABLE keyspace.cfname_some_field_<char>_idx (
    some_field_<char> type,
    ts timestamp,
    row_key uuid,
    PRIMARY KEY ((some_field_<char>), ts, row_key)
);

目的是支持这种查询:

SELECT * FROM index WHERE some_field_<char> = X AND ts >= Y AND ts <= Z;

我将来也希望支持1-2个更高级别的群集查询。

请注意,我要索引的字段内的值非常独特。

如果对索引的典型查询可能返回100-1000000 row_keys并且我需要查询cfname以检索row_keys的值,那么此架构是否效率低下?当从cfname查询100-1000000个单宽行时,Cassandra将如何执行?

我还考虑了一些事情:将行值嵌入到索引中(大量重复,因为许多记录有10个以上的行和4个以上的字段用于索引)并且在cfname中按日期聚类以获得更宽的行(如果为100) -1000000结果通常在几个日期内。)

1 个答案:

答案 0 :(得分:0)

我也在研究一个类似的用例,我想在DIY索引中改变一件事是主键。

我认为应该是

CREATE TABLE keyspace.cfname_some_field_<char>_idx (
    row_key uuid,    
    some_field_<char> type,
    ts timestamp,
    PRIMARY KEY (row_key,some_field_<char>)
);

因为复合主键中的第一列是分区键。我使用row_key作为分区键的原因是类似的行键存储在同一个分区中。

还不明白为什么要在主键中包含ts?

你的情况可能会指示将它作为主键的一部分使用。

由于