【问题标题】:Filter on the partition and the clustering key with an additional criteria使用附加条件过滤分区和集群键
【发布时间】:2017-12-25 21:54:10
【问题描述】:

我想过滤一个表,该表具有一个分区和一个集群键以及常规列上的另一个条件。我收到以下警告。

InvalidQueryException:无法执行此查询,因为它可能涉及 数据过滤,因此可能具有不可预测的性能。如果你 尽管性能不可预测,但仍希望执行此查询, 使用允许过滤

如果不使用分区和集群密钥,我理解问题所在。就我而言,这是一个相关错误还是我可以忽略它?

这是一个表格和查询的例子。

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;

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

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

    Cassandra 3.0 或更高版本允许过滤具有非主键但性能不可预测的数据

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

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

    不要将字段更新为deletedtrue,而是将您的数据移动到另一个表,比如说mytable_deleted

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

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

    在其上创建索引:

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

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

    阅读更多:When not to use an index

    【讨论】:

    • 感谢您的回答。我还有一个问题。将记录从一个表移动到另一个表创建的墓碑怎么样,有问题吗?
    • 是的,移动数据会创建墓碑。如果少量的墓碑不会产生问题,但如果你经常删除,那么会产生巨大的墓碑。在这种情况下,您应该从客户端过滤数据。阅读:stackoverflow.com/a/27567303/2320144
    • 那么,我将只使用已删除的表,而不删除原始表中的元素。两者都将在元素到期后被删除。
    猜你喜欢
    • 2019-09-07
    • 2017-07-21
    • 1970-01-01
    • 2014-09-16
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多