仅按日期范围查询数据的 Cassandra 最佳实践?

Cassandra best practice for querying data only by date range?

我计划在 Cassandra 中存储日志记录,并且主要需要能够按日期范围查询它们。我的主键是基于时间的 UUID。我见过很多示例,除了某些键之外还允许按日期范围进行过滤,但是有没有什么方法可以仅按日期范围进行有效查询,而无需这样的键,并且不使用 Ordered Partitioner?

不,分区键(主键的第一个元素)允许将查询路由到适当的节点而不是扫描整个集群。然而,如果分区仍然相同,那么数据将不会分布在集群中,并且一些节点将获得工作负载。您可以创建一个 table,例如:

create table log (
   log_type text,
   day text, -- In format YYYY-MM-DD for instance
   id timeuuid,
   message text,
   primary key ((log_type, day), id)
)

然后根据您的日期范围,您可以确定日期值和可能的分区键。在 timeuiid 上添加条件以完成:

select * from log where log_type='xxx' and day='2014-02-19' and dateOf(id)>? and dateOf(id)<?
select * from log where log_type='xxx' and day='2014-02-20' and dateOf(id)>? and dateOf(id)<?
select * from log where log_type='xxx' and day='2014-02-21' and dateOf(id)>? and dateOf(id)<?

另一种选择是使用 ALLOW FILTERING 子句,但这将进行完整的集群扫描。因此,只有当您知道至少 90% 的分区键将包含有趣的数据时,这才是一个好主意。

select * from log where dateOf(id)>? and dateOf(id)<? allow filtering