Cassandra,从仅附加的表中筛选最新的行

Cassandra,从仅附加的表中筛选最新的行,cassandra,Cassandra,目前,我有一个简单的表,如下所示: CREATE TABLE datatable (timestamp bigint, value bigint, PRIMARY KEY (timestamp)) 此表仅在增长,从未被修改。密钥是唯一的时间戳。所有查询都是以下形式的范围查询: SELECT * from datatable WHERE timestamp > 123456 ALLOW FILTERING 此外,查询只请求插入的一小部分最新行。我现在遇到的问题是,这些查询的性能与表大小

目前,我有一个简单的表,如下所示:

CREATE TABLE datatable (timestamp bigint, value bigint,  PRIMARY KEY (timestamp))
此表仅在增长,从未被修改。密钥是唯一的时间戳。所有查询都是以下形式的范围查询:

SELECT * from datatable WHERE timestamp > 123456 ALLOW FILTERING
此外,查询只请求插入的一小部分最新行。我现在遇到的问题是,这些查询的性能与表大小呈负相关。随着表的增长,即使查询只返回几行,获取响应所需的时间也会显著延长

您能否建议我如何修改表模式以避免性能下降(例如,创建索引或设置集群)?
谢谢

添加一些类似于

CREATE TABLE datatable (
  bucket timestamp,
  time timestamp,
  value bigint,
  PRIMARY KEY ((bucket), time)
) WITH CLUSTERING ORDER BY (time DESC);
其中bucket是被截断为天、周或月的日期(可以根据大约的摄取率计算出有多少行,一个合理的目标是每个分区大约64mb,但这是非常灵活的),这样您就可以非常高效地在单个分区内收集一段时间内的所有行

每个节点拥有数十亿个分区将大大降低修复和压缩的速度。此外,分区顺序是随机的(分区键顺序的3个散列),所以您不能按顺序执行上面的查询


有了以上内容,您就可以从开始时间的bucket到当前bucket进行迭代,而不需要
允许过滤
(您永远不应该在大量数据或测试环境之外使用它),结果将按照时间戳的顺序进行。

添加一些时间bucket,如

CREATE TABLE datatable (
  bucket timestamp,
  time timestamp,
  value bigint,
  PRIMARY KEY ((bucket), time)
) WITH CLUSTERING ORDER BY (time DESC);
其中bucket是被截断为天、周或月的日期(可以根据大约的摄取率计算出有多少行,一个合理的目标是每个分区大约64mb,但这是非常灵活的),这样您就可以非常高效地在单个分区内收集一段时间内的所有行

每个节点拥有数十亿个分区将大大降低修复和压缩的速度。此外,分区顺序是随机的(分区键顺序的3个散列),所以您不能按顺序执行上面的查询


通过以上操作,您可以从开始时间的存储桶迭代到当前存储桶,而无需
允许过滤
(您永远不应该在大量数据或测试环境之外使用它),结果将按照时间戳的顺序进行。

允许过滤
将扫描所有节点,而且不建议这样做-这就是为什么您会出现性能问题的原因。你可以添加更多关于你想要实现什么的详细信息吗?专业提示,如果你发现自己需要在Cassandra中使用
允许筛选
,你可能做得不对。
允许筛选
会导致扫描所有节点,不建议这样做-这就是你存在性能问题的原因。你能为你想要实现的目标添加更多细节吗?专业提示,如果你发现自己需要在Cassandra中使用
允许过滤
,你可能做错了。这正是我要说的!有许多与cassandra相关的示例,其中GUID用作主键。GUID似乎与时间戳具有相同的性能问题。是否也应该使用
bucket
来防止性能下降?只有在存在数十亿的情况下,小分区才是一个真正的问题,这种情况发生在上面的时间序列中,但通常不会发生在实体类型的事情中,所以它并不总是一个问题。除了时间序列/队列类型之外,这通常是过度的。如果对GUID键执行了此操作,您可能希望使用基于GUID的某种人工键,以便在不知道添加日期的情况下为查找生成键,即将mod GUID作为bigint添加3000万以保持最大常量3000万个键,或者如果希望能够调整键数,则使用jumphash/rendezvous哈希。这正是我要说的!有许多与cassandra相关的示例,其中GUID用作主键。GUID似乎与时间戳具有相同的性能问题。是否也应该使用
bucket
来防止性能下降?只有在存在数十亿的情况下,小分区才是一个真正的问题,这种情况发生在上面的时间序列中,但通常不会发生在实体类型的事情中,所以它并不总是一个问题。除了时间序列/队列类型之外,这通常是过度的。如果对GUID密钥执行了此操作,则可能需要使用基于GUID的某种人工密钥,以便在不知道添加日期的情况下为查找生成密钥,即将mod GUID作为bigint添加3000万以保持最大恒定值3000万个密钥,或者如果希望能够调整密钥数,则使用jumphash/rendezvous哈希。