我正在尝试通过以下架构存储和检索最后一个活动传感器:
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;