【问题标题】:Cassandra: secondary index inside a single partition (per partition indexing)?Cassandra:单个分区内的二级索引(每个分区索引)?
【发布时间】:2015-12-27 06:10:45
【问题描述】:

这个问题我希望不要在通常的“二级索引与聚类键”问题中得到回答。

这是我的一个简单模型:

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

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

由于问题和查询可能是相当对称的(即我的“矩阵”是最好的表示,还是我应该使用转置的“矩阵”)我无法轻易决定我应该首先放置哪个集群键。我这样做的方式更有意义:对于每个时间戳,我都有一组数据(在该时间戳出现的每个设备的值)。

那么通常的查询是

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'

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

  • 我能否改进我的模型以支持此类查询而无需过多重复?
  • 是否有类似“分区索引”之类的东西?

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    索引可以让你做这样的查询:

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

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

    所以听起来你可能想要两个数据视图。一种基于名称和时间范围,另一种基于名称、设备和时间范围。

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

    【讨论】:

    • 好的,这证实了我的想法。事实上,我需要两个视图/表,但我试图避免重复,或者至少避免在应用程序级别上运动一致性。我不知道在我的案例中看起来超级有趣的物化视图功能!
    猜你喜欢
    • 2017-08-12
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 2014-12-13
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2021-03-14
    相关资源
    最近更新 更多