Cassandra复合主键CQL3

3
如果我想通过时间窗口对我的主键进行分区,为了存储和检索效率,使用时间的文本表示还是截断的本地时间戳会更好?
CREATE TABLE user_data (
user_id TEXT,
log_day TEXT, -- store as 'yyyymmdd' string
log_timestamp TIMESTAMP,
data_item TEXT,
PRIMARY KEY ((user_id, log_day), log_timestamp));

或者

CREATE TABLE user_data (
user_id TEXT,
log_day TIMESTAMP, -- store as (timestamp-in-milli - (timestamp-in-mills mod 86400)
log_timestamp TIMESTAMP,
data_item TEXT,
PRIMARY KEY ((user_id, log_day), log_timestamp));
2个回答

1

关于您的列键“log_timestamp”: 如果您正在使用多个写入客户端(我建议这样做,否则您可能无法接近像C*这样的分布式写优化数据库中的最大吞吐量),则应考虑使用TimeUUIDs而不是时间戳,因为它们是无冲突的(假设MAC地址是唯一的)。否则,您必须保证没有两个插入同时发生,否则您将丢失此数据。您可以在TimeUUID上进行列切片查询和其他基于时间的操作


0

我会使用Unix时间(即1234567890)而不是这两种格式之一 - 要指向整个日期,您只需使用00:00的时间戳。

然而,我非常推荐阅读DataStax开发博客上的Cassandra高级时间序列。它涵盖了在模型中考虑到分桶/拆分的一些重要事项。


时间戳在底层只是一个长整型,所以除非需要 int 分辨率,否则最好直接使用它。 - jbellis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接