卡桑德拉允许过滤
我有一个表,如下卡桑德拉允许过滤
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的结果
正如你提及。但在此之后,它将依靠过滤来搜索您在查询本身允许的数据。
现在,请注意以下事项
如果表中包含例如100万行,其中95%的请求的值,查询仍然会比较有效,你应该使用允许过滤的。另一方面,如果您的表包含1百万行并且只有2行包含所请求的值,那么您的查询效率极低。 Cassandra将会加载999,998行。如果经常使用查询,最好在time1列上添加一个索引。
所以先确保这一点。如果它对您有利,请使用FILTERING。 否则,在“操作”中添加二级索引将是明智之举。
PS:有一些小的编辑。
这是否允许过滤效率?
当您编写“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进一步的信息。
我在不同的问题上阅读了同样的答案。这不是这个问题的答案。如果您知道,请详细说明查询的工作方式。 – Bharathi
我不知道那个问题,但是我在这个旧的[datastax doc](https://www.datastax.com/dev/blog/allow-filtering-explained-2)上阅读了这个问题。看看它。 虽然我仍然认为我的答案解释得很好。但是,如果您发现其他情况,请在此提及。也会清除我的错误观念(如果有的话)。谢谢! – r005t3r
感谢您的更新。我知道ALLOW FILTERING将扫描整个列系列。但是这里的问题是,如果where子句中有多个过滤参数,而非索引列是最后一个,那么过滤器将如何工作?请阅读该问题,并告知我是否需要进行任何编辑以获得更好的理解。 – Bharathi