请帮我解决一个困惑。 Cassandra book尝试基于不属于PK的列进行查询的声明应该失败(此列也没有辅助索引)。但是,当我尝试这样做时,我可以看到这个警告:
无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能。如果要在性能不可预测的情况下执行此查询,请使用ALLOW FILTERING
将ALLOW FILTERING
附加到查询后,就不会再出现错误了。我理解对表现的影响 - 但是与书中所写的内容存在明显的矛盾。这个功能是后来添加还是书籍作者只是错过了这个?
答案 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会警告你并依靠你做出好的选择。
谢谢,
哈利