卡桑德拉允许过滤

问题描述:

我有一个表,如下卡桑德拉允许过滤

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 

难道这允许过滤的高效?

我期待的是卡桑德拉将在此为了

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子句中有多个过滤参数,而非索引列是最后一个,那么过滤器将如何工作? 请解释。

一般允许过滤效率不高。

但是最终取决于你要读取的数据的大小(cassandra必须使用允许过滤)以及从中提取数据的大小。

在你的情况卡桑德拉不需要滤波高达:

  1. 由范围柱(开始)对1的结果
开始=>

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

现在,请注意以下事项

如果表中包含例如100万行,其中95%的请求的值,查询仍然会比较有效,你应该使用允许过滤的。另一方面,如果您的表包含1百万行并且只有2行包含所请求的值,那么您的查询效率极低。 Cassandra将会加载999,998行。如果经常使用查询,最好在time1列上添加一个索引。

所以先确保这一点。如果它对您有利,请使用FILTERING。 否则,在“操作”中添加二级索引将是明智之举。

PS:有一些小的编辑。

+1

我在不同的问题上阅读了同样的答案。这不是这个问题的答案。如果您知道,请详细说明查询的工作方式。 – Bharathi

+0

我不知道那个问题,但是我在这个旧的[datastax doc](https://www.datastax.com/dev/blog/allow-filtering-explained-2)上阅读了这个问题。看看它。 虽然我仍然认为我的答案解释得很好。但是,如果您发现其他情况,请在此提及。也会清除我的错误观念(如果有的话)。谢谢! – r005t3r

+0

感谢您的更新。我知道ALLOW FILTERING将扫描整个列系列。但是这里的问题是,如果where子句中有多个过滤参数,而非索引列是最后一个,那么过滤器将如何工作?请阅读该问题,并告知我是否需要进行任何编辑以获得更好的理解。 – Bharathi

这是否允许过滤效率?

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

我期待的是卡桑德拉将在此阶滤波器...

啊,这是会发生什么。然而,在查询中包含一个ALLOW FILTERING子句通常意味着一个糟糕的表设计,那就是你没有遵循一些关于Cassandra建模的指导(特别是“一个查询< - >一个表”)。

作为一个解决方案,我会提示你要包括在聚集键的action场只是start场之前,修改你的表定义:

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

然后你就会重写查询没有任何允许过滤的条款:

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

只具有轻微问题,如果一个创纪录的“开关” action值,你不能在单012进行更新字段(因为它现在是集群密钥的一部分),因此您需要使用旧的action值执行删除操作,并使用正确的新值插入它。但是如果你有Cassandra 3.0+,所有这些都可以在新的Materialized View实现的帮助下完成。有一个look at the documentation进一步的信息。

+0

如果查询将按照我所说的顺序扫描磁盘,那么允许过滤不会是错误的选择权。因为它仅过滤有限数量的数据。 – Bharathi

+0

@Bharathi:你想扫描墓碑吗?我们对您的数据一无所知,所以这里的一般建议是“不要使用ALLOW FILTERING”,但如果您认为自己有一小部分记录,请继续使用它。毕竟,使用大脑绝对是在卡桑德拉模型的最佳方式... – xmas79

+0

我只是想了解允许过滤。我的使用案例与我在这里陈述的完全不一样,我不能公开表达。我想知道,如果cassandra按照我所述的顺序进行过滤,那么不会担心它要扫描的数据量。 – Bharathi