仅按日期范围查询数据的 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
我计划在 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