正如我在范围查询中所知,Cassandra检索由culstring键排序的结果。我可以在查询中更改此行为吗?

时间:2016-07-07 13:55:27

标签: cassandra cql

我试图通过此架构存储和检索最后一个活动传感器:

CREATE TABLE last_signals (
  section bigint,
  sensor  bigint,
  time    bigint,
  PRIMARY KEY (section, sensor)
);

此表的行将每隔几秒更新一次,结果热传感器将保留在memtable中。但是当我运行这样的查询时会发生什么:

SELECT * FROM last_signals 
   WHERE section = ? AND time > ?
   Limit ? 
   ALLOW FILTERING;

结果将是这样的(按聚类键排序):

 sect | sens | time 
------+------+------
    1 |    1 |    4 
    1 |    2 |    3 
    1 |    4 |    2 
    1 |    5 |    9 

第一个问题:在所有版本中,此结果是否保证相同? (我使用3.7),下一个是我如何改变这种行为(使用查询选项,建模等)。事实上,我需要先考虑最后一次写入,而不考虑cllicking-keys顺序。我认为在这种情况下,我的阅读速度会快得多。

1 个答案:

答案 0 :(得分:1)

除了使用群集密钥之外,我不认为有任何方法可以保证订单。因此,您的ALLOW FILTERING查询可能代价高昂,甚至可能超时。您可以考虑以下架构:

CREATE TABLE last_signals_by_time (
  section bigint,
  sensor  bigint,
  time    bigint,
  dummy   bool,
  PRIMARY KEY ((section, sensor), time)
) WITH CLUSTERING ORDER BY (time DESC);

使用TTL插入而不是更新,这样您就不必手动清理旧条目。 (需要虚拟字段才能使TTL工作)

然后只需按并行

中的每个部分/传感器运行读取查询
 SELECT * FROM last_signals_by_time 
   WHERE section = ? AND sensor = ?
   LIMIT 1;