2014-10-01 84 views
0

我目前有一个列族,我想在多列上编制索引。我目前想使用的模式是:Cassandra - 在具有许多唯一值的多列上索引

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个结果通常在几个日期内)。

回答

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?

再次您可能会指示将它用作主键的一部分。

谢谢

+0

在我的使用案例中,我想在某个时间范围内找到某种类型的对象。时间戳与对象相关,而不是当我插入行时。 – user219694 2014-12-28 01:58:48

相关问题