【问题标题】:apache cassandra limit and in clauselapache cassandra 限制和条款
【发布时间】:2016-12-23 07:45:58
【问题描述】:

我的 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 查询 - 但这会返回所有结果,我无法使用 Limit。

【问题讨论】:

  • 感谢您的 cmets。我实施了第二个解决方案:第二个替代方案是异步运行每个月的每一天查询,并在应用程序级别过滤掉最新的度量。这只是一小段代码。

标签: cassandra cql database-partitioning nosql


【解决方案1】:

IN 子句通常很糟糕,但由于您最多放在那里 31 天,恕我直言,您可以保留它而不必担心性能。

第二种选择是异步运行每月一次的查询,并在应用程序级别过滤掉最新的度量。这只是一小段代码。

如果您有很多传感器,第三种选择是按月中的某天按后代顺序查询,希望尽快找到最后一个测量值。这样,您将运行较少数量的查询,从集群中移除一些负载,但会以应用程序级别的一些延迟为代价,因为如果您的最后一次测量是在本月 29 日,您查询 31 日并没有找到结果,一天回去查询30号没有结果,回去一天查询29号找到你的结果。

【讨论】:

  • IN 子句总是不好的。最好并行运行异步查询而不是使用 IN 子句,因为您将压力放在协调器上,而不是在客户端上处理它。您可以通过将时间段存储在一张表中来解决它,然后您就可以始终知道最新数据在哪里。
  • 我不同意。如果你正在锤击你的集群,这显然很糟糕。如果您每 X 天运行一次此查询,这不会破坏任何内容。此外,OP 询问如何在不进一步对数据进行非规范化的情况下执行此操作,因此您的建议不能令人满意。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 2018-02-05
  • 2017-02-13
  • 1970-01-01
  • 2014-01-20
  • 2016-09-15
相关资源
最近更新 更多