代码之家  ›  专栏  ›  技术社区  ›  rootturk

Cassandra CQLEngine允许过滤

  •  1
  • rootturk  · 技术社区  · 6 年前

    我正在使用Python Cassandra Cqlengine扩展。我创建了多对多表,但在用户应用程序模型查询筛选过程中收到错误。我已经为这个问题准备了不同的资源,但是我没有完全理解这个问题。

    资料来源: https://ohioedge.com/2017/07/05/cassandra-primary-key-partitioning-key-clustering-key-a-simple-explanation/

    Cassandra Allow filtering

    Is ALLOW FILTERING in Cassandra for following query efficient?

    数据库模型:

    class UserApplications(BaseModel):
        __table_name__ = "user_applications"
    
        user_id = columns.UUID(required=True, primary_key=True, index=True)
        application_id = columns.UUID(required=True, primary_key=True, index=True)
        membership_id = columns.UUID(required=True, primary_key=True, index=True)
    

    错误消息:

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

    Python CQLEngine代码:

    q = UserApplications.filter(membership_id=r.membership_id,
                                        user_id=r.user_id,
                                        application_id=r.application_id)
    

    CQLEngine SQL语句:

    SELECT "id", "status", "created_date", "update_date" FROM db.user_applications WHERE "membership_id" = %(0)s AND "user_id" = %(1)s AND "application_id" = %(2)s LIMIT 10000
    

    描述表格结果:

    CREATE TABLE db.user_applications (
        id uuid,
        user_id uuid,
        application_id uuid,
        membership_id uuid,
        created_date timestamp,
        status int,
        update_date timestamp,
        PRIMARY KEY (id, user_id, application_id, membership_id)
    ) WITH CLUSTERING ORDER BY (user_id ASC, application_id ASC, membership_id ASC)
        AND bloom_filter_fp_chance = 0.01
        AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
        AND comment = ''
        AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
        AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
        AND crc_check_chance = 1.0
        AND dclocal_read_repair_chance = 0.1
        AND default_time_to_live = 0
        AND gc_grace_seconds = 864000
        AND max_index_interval = 2048
        AND memtable_flush_period_in_ms = 0
        AND min_index_interval = 128
        AND read_repair_chance = 0.0
        AND speculative_retry = '99PERCENTILE';
    CREATE INDEX user_applications_membership_id_idx ON db.user_applications (membership_id);
    

    等待你的帮助。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Mohamed Ibrahim Elsayed    6 年前

    出现此错误的原因是您没有添加 ALLOW FILTERING 如果添加了 允许筛选 在查询结束时,它应该可以工作。

    使用 允许筛选 在Cassandra中,查询实际上允许Cassandra在加载某些行之后(可能在加载表中的所有行之后)将其过滤掉。例如,在查询的情况下,Cassandra可以执行此查询的唯一方法是从UserApplications表中检索所有行,然后筛选出那些没有您所限制的每一列的请求值的行。

    使用 允许筛选 可能会产生不可预测的性能结果,而实际性能取决于表中的数据分布。例如,如果您的表包含100万行,其中95%的行具有指定查询的列的请求值,则仍然相对有效,您应该使用ALLOW筛选。另一方面,如果表包含100万行,而只有2行包含所请求的值,那么查询效率极低。卡桑德拉将免费加载99998行。通常,如果您的查询需要添加 允许筛选 然后,您可能应该重新考虑您的模式,或者为您经常查询的列添加辅助索引。

    CREATE TABLE db.user_applications (
        user_id uuid,
        application_id uuid,
        membership_id uuid,
        created_date timestamp,
        status int,
        update_date timestamp,
        PRIMARY KEY ((user_id, application_id, membership_id))
    );