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



我正在尝试通过以下架构存储和检索最后一个活动传感器:

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),下一个是我如何更改此行为(使用查询选项、建模等)。事实上,我需要先在不考虑 clustring-keys 顺序的情况下获得最后的写入。我认为在这种情况下,我的阅读速度会快得多。

我认为除了使用集群键之外,没有任何方法可以保证顺序。因此,您的允许筛选查询可能代价高昂,甚至可能超时。您可以考虑以下架构:

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;

最新更新