Cassandra,从仅附加表

时间:2017-12-05 14:21:12

标签: cassandra

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

CREATE TABLE datatable (timestamp bigint, value bigint,  PRIMARY KEY (timestamp))

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

SELECT * from datatable WHERE timestamp > 123456 ALLOW FILTERING

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

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

1 个答案:

答案 0 :(得分:5)

添加一些时间段,如

CREATE TABLE datatable (
  bucket timestamp,
  time timestamp,
  value bigint,
  PRIMARY KEY ((bucket), time)
) WITH CLUSTERING ORDER BY (time DESC);

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

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

通过上述内容,您可以从开始时间的桶中迭代到没有ALLOW FILTERING的当前桶(您永远不应该在玩具数量或测试环境之外的东西之外使用),结果将是按时间戳顺序排列。