【问题标题】:How to optimise this Cassandra structure?如何优化这个 Cassandra 结构?
【发布时间】:2021-09-23 13:51:46
【问题描述】:

所以我在 Cassandra 3.11 中有这张表

CREATE TABLE somekeyspace."Message" (
    id uuid,
    "requestId" text,
    "createdAt" timestamp,
    attachments list<text>,
    body text,
    deleted boolean,
    deleted_by text,
    deleted_on timestamp,
    "extraData" text,
    "isRead" boolean,
    "recipientBrandId" text,
    "recipientId" text,
    "recipientName" text,
    "recipientSpaceId" text,
    "requesterBrandId" text,
    "requesterSpaceId" text,
    "senderId" text,
    "senderName" text,
    PRIMARY KEY (id, "requestId", "createdAt")
) WITH CLUSTERING ORDER BY ("requestId" ASC, "createdAt" DESC)
    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 "Message_senderId_idx" ON coretail."Message" ("senderId");
CREATE INDEX "Message_requestId_idx" ON coretail."Message" ("requestId");
CREATE INDEX "Message_senderName_idx" ON coretail."Message" ("senderName");
CREATE CUSTOM INDEX fn_prefix ON coretail."Message" (body) USING 'org.apache.cassandra.index.sasi.SASIIndex' WITH OPTIONS = {'mode': 'CONTAINS'};
CREATE INDEX "Message_isRead_idx" ON coretail."Message" ("isRead");

现在,我想执行以下查询之一:

SELECT * from "Message" WHERE ("senderId"=someUserId OR "recipientId"=someUserId) AND body LIKE '%someKeyword';

或者:

SELECT * from "Message" WHERE "senderId"=someUserId AND body LIKE '%foo';

我知道这些查询是无效的,问题是如何使它们起作用?

  • 第一个不好,因为 Cassandra 不支持 OR
  • 第二个不好,因为它需要 ALLOW FILTERING。

我的问题:我应该如何修改表才能选择 senderId 或 recipientId 为 X 并且“正文”与 LIKE 查询匹配的记录? ALLOW FILTERING 是低效的。如何有效且最好使用单个查询来做到这一点?

提前致谢!

【问题讨论】:

  • 我的第一个想法是,如果您不打算通过id 进行查询,那么它应该是您的最后一个集群键而不是分区键。
  • 考虑在 Cassandra 中使用太阳能搜索。

标签: cassandra cql


【解决方案1】:

Cassandra 本身不支持布尔 ORLIKE 运算符。

查看名为 SSTable-Attached Secondary Index (SASI) 的自定义索引器,它支持类似于 SQL LIKE 运算符的 PREFIXCONTAIN 运算符。例如,此查询将返回 Jack 或 Jill 的匹配项:

SELECT ... FROM ... WHERE name LIKE 'J%';

注意 SASI is considered experimental 所以不建议用于生产。

还有Storage-Attached Indexes (SAI),它是一个全球分布的索引,现在可以在Astra、DSE 和开源 Apache Cassandra 上使用(增强提案CEP-7)。

与二级索引相比,SAI 提供了更多功能,并且写入速度更快,读取吞吐量更高。详情请见SAI docsTry it for free,不需要信用卡。干杯!

【讨论】:

    猜你喜欢
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多