Cassandra - 在具有许多唯一值的多列上索引
问题描述:
我目前有一个列族,我想在多列上编制索引。我目前想使用的模式是: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个结果通常在几个日期内)。
答
我也在研究一个类似的用例,我想在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?
再次您可能会指示将它用作主键的一部分。
谢谢
在我的使用案例中,我想在某个时间范围内找到某种类型的对象。时间戳与对象相关,而不是当我插入行时。 – user219694 2014-12-28 01:58:48