使用其他条件筛选分区和群集键

时间:2017-07-20 09:26:37

标签: cassandra cql

我希望在具有分区和聚类键的表上过滤常规列上的其他条件。我收到了以下警告。

  

InvalidQueryException:无法执行此查询,因为它可能涉及   数据过滤因此可能具有不可预测的性能。如果你   想要执行此查询,尽管性能不可预测,   使用ALLOW FILTERING

如果不使用分区和群集密钥,我理解该问题。在我的情况下,这是一个相关的错误还是我可以忽略它?

以下是表和查询的示例。

CREATE TABLE mytable(
    name text,
    id uuid,
    deleted boolean
    PRIMARY KEY((name),id)
)

SELECT id FROM mytable WHERE name='myname' AND id='myid' AND deleted=false;

1 个答案:

答案 0 :(得分:3)

在Cassandra中,您无法使用非主键列过滤数据,除非您在其中创建索引。

Cassandra 3.0或更高版本允许使用非主键过滤数据但性能无法预测

Cassandra 3.0或更高版本,如果您提供所有主键(作为您的给定查询),那么您可以使用ALLOW FILTERING查询,忽略警告

否则从客户端进行过滤或删除字段deleted并创建另一个表格:

不是将字段更新为deleted true,而是将数据移至另一个表格,而不是mytable_deleted

CREATE TABLE mytable_deleted (
    name text,
    id uuid
    PRIMARY KEY (name, id)
);

现在,如果您只有mytable上的未删除数据和mytable_deleted表上的已删除数据

在其上创建索引:

deleted是一个低基数列。所以记住

  

对大型群集中的索引列进行查询通常需要整理来自多个数据分区的响应。随着更多计算机添加到群集,查询响应速度变慢。通过缩小搜索范围,可以在查找大分区中的行时避免性能损失。

阅读更多:When not to use an index