目前我有一个简单的表格如下:
CREATE TABLE datatable (timestamp bigint, value bigint, PRIMARY KEY (timestamp))
此表仅在增长,并且从未被修改过。关键是独特的时间戳。所有查询都是以下形式的范围查询:
SELECT * from datatable WHERE timestamp > 123456 ALLOW FILTERING
此外,查询仅请求插入一小组最新行。我现在遇到的问题是这些查询的性能与表大小负相关。随着表的增长,即使查询只返回几行,获取响应也需要更长的时间。
您是否可以建议我应该如何修改表模式以避免性能下降(例如,创建索引或设置群集)? 谢谢!
答案 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
的当前桶(您永远不应该在玩具数量或测试环境之外的东西之外使用),结果将是按时间戳顺序排列。