查询不属于PK或二级索引的列

时间:2018-05-23 16:55:05

标签: cassandra

请帮我解决一个困惑。 Cassandra book尝试基于不属于PK的列进行查询的声明应该失败(此列也没有辅助索引)。但是,当我尝试这样做时,我可以看到这个警告:

  

无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能。如果要在性能不可预测的情况下执行此查询,请使用ALLOW FILTERING

ALLOW FILTERING附加到查询后,就不会再出现错误了。我理解对表现的影响 - 但是与书中所写的内容存在明显的矛盾。这个功能是后来添加还是书籍作者只是错过了这个?

2 个答案:

答案 0 :(得分:1)

我认为你有一本教科书可以指导你完成重要的noSQL概念,但不要依赖它,因为CASSANDRA是开源的并且不断由社区更新。诸如official apache documentation之类的在线资源是检索有关新功能和现有功能的更新信息/教程的更好选择。

虽然ALLOW FILTERING确实存在,但仍建议使用不同的表构造(例如,将列更改为键)或创建INDEX以保持快速查询。

答案 1 :(得分:0)

AFAIK,Cassandra从版本1开始ALLOW FILTERING

还要解释ALLOW FILTERING

根据datastax文档,

我们以下表为例:

CREATE TABLE blogs (blogId int, 
                    time1 int, 
                    time2 int, 
                    author text, 
                    content text, 
                    PRIMARY KEY(blogId, time1, time2));

如果执行以下查询:

SELECT * FROM blogs;

Cassandra会返回表博客包含的所有数据。

如果您现在只想要指定时间1的数据,您自然会在列time1上添加相同的条件:

SELECT * FROM blogs WHERE time1 = 1418306451235;

作为回应,您将收到以下错误消息:

  

错误请求:无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能。如果要在性能不可预测的情况下执行此查询,请使用ALLOW FILTERING。

Cassandra知道它可能无法以有效的方式执行查询。因此,它警告你:“小心。像这样执行此查询可能不是一个好主意,因为它可以使用大量的计算资源“。

Cassandra执行此查询的唯一方法是从表博客中检索所有行,然后过滤掉那些没有time1列所请求值的行。

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

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

不幸的是,Cassandra没有办法区分上述两种情况,因为它们取决于表格的数据分布。因此Cassandra会警告你并依靠你做出好的选择。

谢谢,
哈利