Cassandra:单个分区内的二级索引(每个分区索引)?

时间:2015-12-26 10:47:09

标签: cassandra

这个问题是我希望在通常的“二级索引诉集群密钥”问题中没有回答。

这是一个简单的模型:

CREATE TABLE ks.table1 (
name text,
timestamp int,
device text,
value int,
PRIMARY KEY (md_name, timestamp, device)
)

基本上我将我的数据视为名为name的数据集,每个数据集都是一种包含timestamps的稀疏二维矩阵(rows = device,columns = value

由于问题和查询可以非常对称(即,我的“矩阵”是最佳表示,或者我应该使用转置的“矩阵”)我无法轻易地决定我应该首先放置什么聚类键。它比我做的更有意义:对于每个时间戳我都有一组数据(该时间戳中每个设备的值)。

通常的查询是

select * from cycles where md_name = 'xyz';

它针对单个分区,这将是超级快速,足够简单。如果有大量数据,我的用户可以这样做:

select * from cycles where md_name = 'xyz' and timestamp < n;

但是我希望能够“转置”问题并执行此操作:

 select * from cycles where md_name = 'xyz' and device='uvw';

这意味着我必须在device上创建二级索引。

但是(这就是问题开始的地方),这个索引与通常的索引有点不同,因为它用于单个分区内的查询。创建索引允许在多个分区上执行相同的操作:

select * from cycles where device='uvw'

在我的情况下,这不是必需的。

  • 我可以改进我的模型以支持此类查询而不会有太多重复吗?
  • 是否有类似“分区索引”的内容?

1 个答案:

答案 0 :(得分:1)

索引允许您执行以下查询:

select * from cycles where md_name='xyz' and device='uvw'

但是这将返回xyz分区中该设备的所有时间戳。

所以听起来好像你想要两个数据视图。一旦基于名称和时间范围,一个基于名称,设备和时间范围。

如果这是您要求的,那么您可能需要两张桌子。如果您正在使用C * 3.0,那么您可以使用物化视图功能来创建第二个视图。如果您使用的是早期版本,那么您必须创建两个表并对应用程序中的每个表执行写操作。