如何解决如何优化这个 Cassandra 结构?
所以我在 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
- 第二个不好,因为它需要允许过滤。
我的问题:我应该如何修改表才能选择senderId或recipientId为X且“body”与LIKE查询匹配的记录?允许过滤效率低下。如何通过单个查询有效且最好地执行此操作?
提前致谢!
解决方法
Cassandra 本身不支持布尔 update
或 OR
运算符。
查看名为 SSTable-Attached Secondary Index (SASI) 的自定义索引器,它支持类似于 SQL LIKE
运算符的 PREFIX
和 CONTAIN
运算符。例如,此查询将返回 Jack 或 Jill 的匹配项:
LIKE
注意 SASI is considered experimental so 不推荐用于生产。
还有 Storage-Attached Indexes (SAI),它是一个全球分布的索引,现在可在 Astra、DSE 和即将在开源 Apache Cassandra 中使用(增强提案 CEP-7)。
与二级索引相比,SAI 提供更多功能,写入速度更快,读取吞吐量更高。有关详细信息,请参阅 SAI docs。 Try it for free,不需要信用卡。干杯!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。