【问题标题】:ALLOW FILTERING implementation @Cassandra允许过滤实现@Cassandra
【发布时间】:2015-05-07 11:20:19
【问题描述】:

我有一张如下表:

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 上的关键索引。

感谢您的回复。 谢谢

【问题讨论】:

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


    【解决方案1】:

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

    select * from tab ALLOW FILTERING;
    

    对于这个查询,您没有指定WHERE 子句,因此它将返回tabs 表中的所有行。 ALLOW FILTERING 不应该以任何明显的方式改变这个性能。

    select * from tab where id = 'id01' ALLOW FILTERING;
    

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

    select * from tab where categoryid = 'cid01' ALLOW FILTERING;
    

    这样的查询让 Cassandra 高兴!是的,categoryid 是您的分区键这一事实将得到尊重,并且您的结果集将包含 categoryid='cid01' 所在的所有 CQL 行。作为额外的奖励,在这种情况下,您的聚类顺序将被强制执行。

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

    在我看来,我会避免需要 ALLOW FILTERING 的查询。我当然不会在生产环境或 OLTP 环境中运行。

    【讨论】:

    • 你能告诉我这个查询会发生什么吗? select * from tab where categoryid = 'cid01' and desc='xyz' ALLOW FILTERING;
    猜你喜欢
    • 2017-07-23
    • 2019-01-13
    • 2023-03-10
    • 2020-10-12
    • 2021-09-10
    • 2016-08-14
    • 2017-12-20
    • 2013-09-02
    • 1970-01-01
    相关资源
    最近更新 更多