apache-cassandra极限和子句

apache-cassandra极限和子句,cassandra,cql,database-partitioning,nosql,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) 为了计算一个月的消耗量,我需要一个月的最新电表读数。在

我的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查询,但这会返回所有结果,我不能使用限制。

In子句通常很糟糕,但由于最多31天,我想您可以保留它,而不必担心性能

第二种方法是在每月异步运行一次查询,并在应用程序级别筛选出最新的度量值。这只是一点代码


第三种选择,如果你有很多传感器,是按月日的顺序逐日查询,希望很快找到最后一个测量值。通过这种方式,您可以运行更少的查询,从集群中移除一些负载,而在应用程序级别牺牲一些延迟,因为如果您的最后一次度量是在本月29日,那么您查询31日时没有结果,返回一天查询30日时没有结果,返回一天时查询29日时找到结果

IN子句通常是不好的,但是既然你最多放31天,我想你可以保留它而不用担心性能

第二种方法是在每月异步运行一次查询,并在应用程序级别筛选出最新的度量值。这只是一点代码


第三种选择,如果你有很多传感器,是按月日的顺序逐日查询,希望很快找到最后一个测量值。通过这种方式,您可以运行更少的查询,从集群中移除一些负载,而在应用程序级别牺牲一些延迟,因为如果您的最后一次度量是在本月29日,那么您查询31日时没有结果,返回一天查询30日时没有结果,返回一天时查询29日时找到结果

IN子句总是不好的。最好是并行运行异步查询,而不是使用in子句,因为您将重点放在协调器上,而不是在客户机上处理它。你可以通过在一个表中存储时间段来解决这个问题,然后你总是知道你的最新数据在哪里。我不同意。如果你正在敲打你的集群,这显然是不好的。如果每X天运行一次此查询,则不会中断任何操作。此外,OP询问如何在不进一步规范化数据的情况下执行此操作,因此您的建议不能令人满意。IN子句总是不好的。最好是并行运行异步查询,而不是使用in子句,因为您将重点放在协调器上,而不是在客户机上处理它。你可以通过在一个表中存储时间段来解决这个问题,然后你总是知道你的最新数据在哪里。我不同意。如果你正在敲打你的集群,这显然是不好的。如果每X天运行一次此查询,则不会中断任何操作。此外,OP询问如何在不进一步规范化数据的情况下执行此操作,因此您的建议不能令人满意。感谢您的评论。我实现了第二个解决方案:第二个替代方案是在每月异步运行一个查询,并在应用程序级别过滤掉最新的度量。这只是一点代码。谢谢你的评论。我实现了第二个解决方案:第二个替代方案是在每月异步运行一个查询,并在应用程序级别过滤掉最新的度量。这只是一点代码。