apache cassandra限制和clausel

时间:2016-12-23 07:45:59

标签: cassandra cql database-partitioning nosql

我的Cassandra集群中有以下时间序列:

CREATE TABLE consumptions (
  meter_id int,
  date date,
  meter_date_time timestamp,
  data text,
  PRIMARY KEY ((meter_id, date), meter_date_time)
) WITH CLUSTERING ORDER BY (meter_date_time DESC)

要计算一个月的消耗,我需要一个月的最新抄表。在我的情况下,查询如下所示:

select * from consumtions 
where meter_id = 1 and 
date in (...'2016-12-30','2016-12-31'...)
limit 1

我知道具有多个分区键的IN子句是反模式。有没有非规范化的查询有更好的方法吗?

在我的其他大多数查询中,我都在使用asnyc查询 - 但这会返回每个结果,但我无法使用限制。

1 个答案:

答案 0 :(得分:3)

IN条款通常很糟糕,但由于你最多放置31天,恕我直言,你可以保留它而不用担心表演。

第二种方法是每月运行一对一的查询异步,并过滤掉应用程序级别的最新度量。那只是一些代码。

第三种选择,如果你有很多传感器,那就是按照后代顺序查询每月的日期,希望尽快找到最后一项措施。这样,您可以运行较少数量的查询,从群集中删除一些负载,但会牺牲应用程序级别的某些延迟,因为如果您的上一个度量是在该月的29日,则查询第31个并且找不到结果,回去一天,查询30日,找不到结果,回去一天,查询第29天,找到你的结果。