我目前有一个列系列,我想在多列上编制索引。我目前正在考虑使用的架构是:
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 :(得分: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?
你的情况可能会指示将它作为主键的一部分使用。
由于