Cassandra允许过滤

时间:2017-03-03 10:18:27

标签: cassandra datastax cql datastax-enterprise

我有一张表格如下

CREATE TABLE test (
 day int,
 id varchar,  
 start int,
 action varchar,  
 PRIMARY KEY((day),start,id)
);

我想运行此查询

Select * from test where day=1 and start > 1475485412 and start < 1485785654 
and action='accept' ALLOW FILTERING

允许过滤有效吗?

我期待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. 

因此,对于此查询,允许过滤不是一个糟糕的选择。

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

2 个答案:

答案 0 :(得分:4)

  

这是否允许过滤效率?

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

  

我期待cassandra会按此顺序过滤......

是的,这将是会发生的事情。但是,在查询中包含ALLOW FILTERING子句通常意味着糟糕的表设计,即您没有遵循Cassandra建模的某些指导原则(特别是&#34;一个查询&lt; - &gt;一个表& #34)。

作为解决方案,我可以提示您在action字段之前的群集密钥中包含start字段,修改表定义:

CREATE TABLE test (
 day int,
 id varchar,  
 start int,
 action varchar,  
 PRIMARY KEY((day),action,start,id)
);

然后,您将在没有任何ALLOW FILTERING子句的情况下重写您的查询:

SELECT * FROM test WHERE day=1 AND action='accept' AND start > 1475485412 AND start < 1485785654

只有次要问题,如果一个记录&#34;切换&#34; action值无法对单个action字段执行更新(因为它现在是群集密钥的一部分),因此您需要使用旧版action执行删除操作value并使用正确的新值插入它。但是如果你有Cassandra 3.0+,所有这些都可以在新的Materialized View实现的帮助下完成。有look at the documentation了解更多信息。

答案 1 :(得分:0)

通常允许过滤效率不高。

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

在你的情况下,cassandra不需要过滤到:

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

如你所说。但在此之后,它将依赖于过滤搜索数据,这是您在查询中允许的。

现在,请记住

  

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

     

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

首先确保这一点。如果它对您有利,请使用FILTERING。 否则,在'action'上添加二级索引是明智的。

PS:有一些小修改。