我试图通过此架构存储和检索最后一个活动传感器:
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顺序。我认为在这种情况下,我的阅读速度会快得多。
答案 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;