这个问题是我希望在通常的“二级索引诉集群密钥”问题中没有回答。
这是一个简单的模型:
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'
在我的情况下,这不是必需的。
答案 0 :(得分:1)
索引允许您执行以下查询:
select * from cycles where md_name='xyz' and device='uvw'
但是这将返回xyz分区中该设备的所有时间戳。
所以听起来好像你想要两个数据视图。一旦基于名称和时间范围,一个基于名称,设备和时间范围。
如果这是您要求的,那么您可能需要两张桌子。如果您正在使用C * 3.0,那么您可以使用物化视图功能来创建第二个视图。如果您使用的是早期版本,那么您必须创建两个表并对应用程序中的每个表执行写操作。