apache cassandra 限制和子句
apache cassandra limit and in clausel
我的 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 查询 - 但这会 return 每个结果,我不能使用限制。
IN 子句通常不好,但由于您最多放置 31 天,恕我直言,您可以保留它而不必担心性能。
第二种选择是 运行 每月一次查询异步,并在应用程序级别过滤掉最新的度量。这只是一小段代码。
如果您有很多传感器,第三种选择是按后代顺序按月中的某天进行查询,希望尽快找到最后一个测量值。通过这种方式,您可以 运行 减少查询数量,从集群中移除一些负载,但会以应用程序级别的一些延迟为代价,因为如果您的最后一次测量是在该月的 29 日,您将查询 31 日和查不到结果,一天回头查询 30 号查不到结果,一天回头查询 29 号查不到你的结果。
我的 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 查询 - 但这会 return 每个结果,我不能使用限制。
IN 子句通常不好,但由于您最多放置 31 天,恕我直言,您可以保留它而不必担心性能。
第二种选择是 运行 每月一次查询异步,并在应用程序级别过滤掉最新的度量。这只是一小段代码。
如果您有很多传感器,第三种选择是按后代顺序按月中的某天进行查询,希望尽快找到最后一个测量值。通过这种方式,您可以 运行 减少查询数量,从集群中移除一些负载,但会以应用程序级别的一些延迟为代价,因为如果您的最后一次测量是在该月的 29 日,您将查询 31 日和查不到结果,一天回头查询 30 号查不到结果,一天回头查询 29 号查不到你的结果。