我计划在Cassandra中存储日志记录,主要是需要能够按日期范围查询它们。我的主键是基于时间的UUID。我已经看到了许多允许按日期范围进行过滤的示例以及某些密钥,但是有没有办法只使用日期范围有效查询,没有这样的密钥,而且没有使用Ordered Partitioner?
答案 0 :(得分:2)
不,分区键(主键的第一个元素)允许将查询路由到适当的节点,而不扫描整个群集。然而,如果分区仍然相同,那么数据将不会在集群上分布,并且一些节点将获得工作负载。您可以创建一个表格,如:
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