允许过滤实现@Cassandra

时间:2015-03-05 22:16:59

标签: cassandra datastax-java-driver cassandra-cli

我有一张如下表:

CREATE TABLE tab(
    categoryid text,
    id text,
    name text,
    author text,
    desc text,
    PRIMARY KEY (categoryid , id)
) WITH CLUSTERING ORDER BY (id ASC);

CREATE INDEX ON tab (name);
CREATE INDEX ON tab (author);

当我执行以下查询时:

select * from tab ALLOW FILTERING;  ---1
select * from tab where id = 'id01' ALLOW FILTERING;  ---2
select * from tab where categoryid = 'cid01' ALLOW FILTERING;  ---3

三个查询的后端发生了什么?

是否会完全忽略id和categoryid上的关键索引。

感谢回复。 感谢

1 个答案:

答案 0 :(得分:6)

通过指定ALLOW FILTERING,您基本上告诉Cassandra您可以从表中检索所有行,逐个检查每个行,并仅返回与您{{1}匹配的行}子句。根据您的WHERE条款,它可能需要也可能不需要执行此操作。对于大型表或必须查询多个节点以检索所有数据的表,这可能是一个非常缓慢的操作。

WHERE

对于此查询,您没有指定select * from tab ALLOW FILTERING; 子句,因此它将返回WHERE表中的所有行。 tabs不应以任何明显的方式改变表现。

ALLOW FILTERING

在此查询中,Cassandra将从select * from tab where id = 'id01' ALLOW FILTERING; 表中检索所有行,然后返回tab所在的行。 id='id01'是一个聚类键的事实在这里不会产生太大的影响。这是因为分区键对于数据查找很重要,并且群集键通常用于强制行唯一性和排序。顺便说一句,由于您没有通过分区键(id)进行查询,因此它甚至无法在categoryid上强制执行群集顺序,因此您的结果集不会按id排序。< / p>

id

这样的查询使Cassandra高兴!是的,select * from tab where categoryid = 'cid01' ALLOW FILTERING; 是您的分区键这一事实将得到尊重,您的结果集将包含categoryid所有的CQL行。另外,在这种情况下,您的群集顺序将被强制执行。

DataStax的开发者博客有一篇关于这个主题的好文章,可能对你有所帮助:ALLOW FILTERING Explained

在我看来,我会避免需要允许过滤的查询。而且我肯定不会在生产环境或OLTP环境中运行它。