Cassandra,从仅附加表中过滤最新行

kir*_*rbo 1 cassandra

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

CREATE TABLE datatable (timestamp bigint, value bigint,  PRIMARY KEY (timestamp))
Run Code Online (Sandbox Code Playgroud)

此表仅在增长,并且从未被修改过.关键是独特的时间戳.所有查询都是以下形式的范围查询:

SELECT * from datatable WHERE timestamp > 123456 ALLOW FILTERING
Run Code Online (Sandbox Code Playgroud)

此外,查询仅请求插入一小组最新行.我现在遇到的问题是这些查询的性能与表大小负相关.随着表的增长,即使查询只返回几行,获取响应也需要更长的时间.

你能否告诉我应该如何修改表模式以避免性能下降(例如,创建索引或设置集群)?谢谢!

Chr*_*ink 5

添加一些时间像

CREATE TABLE datatable (
  bucket timestamp,
  time timestamp,
  value bigint,
  PRIMARY KEY ((bucket), time)
) WITH CLUSTERING ORDER BY (time DESC);
Run Code Online (Sandbox Code Playgroud)

其中bucket是截断到日期或星期或月份的日期(根据大约摄取率可以计算出多少,一个体面的目标是每个分区大约64mb,但这非常灵活),这样你就可以收集一段时间内的所有行在一个分区内非常有效.

每个节点拥有数十亿个分区将导致维修和压缩速度显着降低.分区顺序也是随机的(分区键顺序的murmur3哈希),所以你不能按顺序执行上面的查询.

通过上面的内容,您可以从开始时间的桶到当前桶进行迭代ALLOW FILTERING(您不应该在玩具数量或测试环境之外的任何事情之外使用),结果将按时间戳的顺序排列.