Cassandra允许过滤

Bha*_*thi 6 cql cassandra datastax-enterprise datastax

我有一张桌子如下

CREATE TABLE test (
 day int,
 id varchar,  
 start int,
 action varchar,  
 PRIMARY KEY((day),start,id)
);
Run Code Online (Sandbox Code Playgroud)

我想运行此查询

Select * from test where day=1 and start > 1475485412 and start < 1485785654 
and action='accept' ALLOW FILTERING
Run Code Online (Sandbox Code Playgroud)

这是否允许过滤有效?

我期待cassandra将按此顺序过滤

1. By Partitioning column(day)
2. By the range column(start) on the 1's result
3. By action column on 2's result. 
Run Code Online (Sandbox Code Playgroud)

所以allow筛选对于这个查询来说不是一个糟糕的选择.

如果where子句上的多个过滤参数和非索引列是最后一个,过滤器将如何工作?请解释.

xma*_*s79 7

这允许过滤有效吗?

当您写“this”时,您的意思是在查询和模型的上下文中,但是 ALLOW FILTERING 查询的效率主要取决于它必须过滤的数据。除非你展示一些真实数据,否则这是一个很难回答的问题。

我期待 cassandra 会按这个顺序过滤......

是的,这就是将会发生的事情。但是,在查询中包含 ALLOW FILTERING 子句通常意味着表设计不佳,也就是说,您没有遵循 Cassandra 建模的一些准则(特别是“一个查询 <--> 一个表”)。

作为解决方案,我可以提示您将该action字段包含在该字段之前的聚集键中start,并修改您的表定义:

CREATE TABLE test (
 day int,
 id varchar,  
 start int,
 action varchar,  
 PRIMARY KEY((day),action,start,id)
);
Run Code Online (Sandbox Code Playgroud)

然后,您将重写查询而不使用任何 ALLOW FILTERING 子句:

SELECT * FROM test WHERE day=1 AND action='accept' AND start > 1475485412 AND start < 1485785654
Run Code Online (Sandbox Code Playgroud)

只有一个问题,如果一条记录“切换”action值,您无法对单个字段执行更新action(因为它现在是集群键的一部分),因此您需要使用旧action值执行删除,然后使用正确的新值。但如果您有 Cassandra 3.0+,所有这些都可以在新的物化视图实现的帮助下完成。请参阅文档以获取更多信息。

  • 我只是想了解允许过滤。我的用例与我在这里所说的不完全相同,我不能公开地将其放在这里。我想知道,如果 cassandra 按照我所说的顺序进行过滤,就不会担心它要扫描的数据量。 (2认同)

r00*_*t3r 2

一般来说,ALLOW FILTERING效率不高。

但最终它取决于您要获取的数据的大小(cassandra 必须使用ALLOW FILTERING)以及从中获取的数据的大小。

在您的情况下,cassandra 不需要过滤最多:

  1. 通过 1 的结果上的范围列(开始)

正如你提到的。但之后,它将依靠过滤来搜索数据,您在查询本身中允许这样做。

现在,请记住以下内容

例如,如果您的表包含 100 万行,其中 95% 具有请求的值,则查询仍然相对有效,您应该使用 ALLOW FILTERING。

另一方面,如果您的表包含 100 万行,并且只有 2 行包含请求的值,则查询效率极低。Cassandra 将免费加载 999、998 行。如果经常使用查询,最好在 time1 列上添加索引。

所以首先要确保这一点。如果它对你有利,请使用过滤。否则,明智的做法是在“action”上添加二级索引。

PS:有一些小的编辑。