我有一张表格如下
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子句上有多个过滤参数,而非索引列是最后一个,过滤器将如何工作? 请解释一下。
答案 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的结果
上的范围列(开始) 醇>
如你所说。但在此之后,它将依赖于过滤搜索数据,这是您在查询中允许的。
现在,请记住
如果您的表包含例如100万行,其中95%具有请求的值,则查询仍然相对有效,您应该使用ALLOW FILTERING。
另一方面,如果您的表包含100万行且只有2行包含请求的值,则查询效率极低。 Cassandra将无需加载999,998行。如果经常使用查询,最好在time1列上添加索引。
首先确保这一点。如果它对您有利,请使用FILTERING。 否则,在'action'上添加二级索引是明智的。
PS:有一些小修改。