Cassandra 查询不属于主键或辅助索引的列

Cassandra 查询不属于主键或辅助索引的列,cassandra,Cassandra,请帮我解决一个困惑。声称基于不属于PK一部分的列进行查询的尝试应失败,并且该列的二级索引也不应失败。但是,当我尝试这样做时,我可以看到以下警告: 无法执行此查询,因为它可能涉及数据筛选,因此可能具有不可预测的性能。如果要在性能不可预测的情况下执行此查询,请使用“允许筛选” 一旦我将ALLOW FILTERING附加到查询中,就不会再有错误了。我理解这对性能的影响——但是书中所写的内容与此有明显的矛盾。这是后来添加的功能,还是书作者只是错过了这一点 AFAIK,Cassandra允许从版本1进行筛

请帮我解决一个困惑。声称基于不属于PK一部分的列进行查询的尝试应失败,并且该列的二级索引也不应失败。但是,当我尝试这样做时,我可以看到以下警告:

无法执行此查询,因为它可能涉及数据筛选,因此可能具有不可预测的性能。如果要在性能不可预测的情况下执行此查询,请使用“允许筛选”

一旦我将ALLOW FILTERING附加到查询中,就不会再有错误了。我理解这对性能的影响——但是书中所写的内容与此有明显的矛盾。这是后来添加的功能,还是书作者只是错过了这一点

AFAIK,Cassandra允许从版本1进行筛选

还要说明允许过滤

根据税务文件

让我们以下表为例:

如果执行以下查询:

SELECT * FROM blogs;
Cassandra将返回表blogs包含的所有数据

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

SELECT * FROM blogs WHERE time1 = 1418306451235;
作为响应,您将收到以下错误消息:

错误请求:无法执行此查询,因为它可能涉及数据筛选,因此可能具有不可预测的性能。如果要在性能不可预测的情况下执行此查询,请使用“允许筛选”

Cassandra知道它可能无法高效地执行查询。因此,它警告您:“小心。这样执行此查询可能不是一个好主意,因为它可能会占用大量的计算资源”

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

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

另一方面,如果表包含100万行,而只有2行包含time1列的请求值,则查询效率极低。卡桑德拉将免费加载99998行。如果经常使用查询,那么最好在time1列上添加索引

不幸的是,Cassandra无法区分上述两种情况,因为它们取决于表的数据分布。因此,卡桑德拉警告你并相信你会做出正确的选择

谢谢,
Harry

我认为很好,你有一本教科书来指导你学习重要的noSQL概念,但不要依赖它,因为CASSANDRA是开源的,社区会不断更新。在线资源(如)是检索有关新功能和现有功能的更新信息/教程的更好选择


尽管允许筛选确实存在,但仍建议使用不同的表结构,例如将列更改为键或创建索引以保持快速查询。

OP询问他们的记录中存在差异的原因,不是ALLOW FILTERING是如何工作的。我看不出这本书的矛盾之处——当您在不允许过滤的情况下执行查询时,它会在给定消息的情况下失败。允许过滤允许您强制执行,但坦率地说,使用允许过滤的查询和不使用过滤的查询是两种不同的查询。
SELECT * FROM blogs WHERE time1 = 1418306451235;