在Cassandra中避免使用复合分区键进行过滤

在Cassandra中避免使用复合分区键进行过滤,cassandra,cql,cassandra-3.0,Cassandra,Cql,Cassandra 3.0,我对卡桑德拉相当陌生,目前必须在卡桑德拉完成下表: CREATE TABLE time_data ( id int, secondary_id int, timestamp timestamp, value bigint, PRIMARY KEY ((id, secondary_id), timestamp) ); 为了不违反最大分区大小,必须使用复合分区键(具有辅助\u id) 我遇到的问题是,我想完成查询SELECT*FROM time\u data,其中id=?。由于表具有复合分区键,因

我对卡桑德拉相当陌生,目前必须在卡桑德拉完成下表:

CREATE TABLE time_data (
id int,
secondary_id int,
timestamp timestamp,
value bigint,
PRIMARY KEY ((id, secondary_id), timestamp)
);
为了不违反最大分区大小,必须使用复合分区键(具有
辅助\u id

我遇到的问题是,我想完成查询
SELECT*FROM time\u data,其中id=?
。由于表具有复合分区键,因此此查询需要筛选。我意识到这是一个查询大量数据和分区的过程,但这对于应用程序来说是必要的。作为参考,
id
的基数相对较低,
secondary\u id
的基数较高


最好的解决办法是什么?我应该简单地允许对查询进行过滤吗?或者最好创建一个二级索引,比如
创建索引id\u idx ON time\u data(id)

您需要在查询中指定完整分区键(允许筛选在大多数情况下会严重影响性能)

一种方法是,如果您知道所有的二级id(您可以在必要时添加一个表来跟踪它们),并在应用程序中执行该工作,查询所有(id,二级id)对,然后处理它们。这样做的缺点是比较复杂,但优点是可以通过异步查询来完成,并且集群中有很多节点并行地参与处理任务


另请参见

我喜欢这个想法,但它确实增加了应用程序的复杂性。在这种情况下,每个客户机需要存储(最多)数千个
secondary\u id
s。如果这些都在一个表中,那么每个客户机会话都将负责执行一个“连接”。事实上,我会将其包装在一个rest服务或其他东西中。