我正在处理一个奇怪的问题,我不知道我的设计是否正确。我有一张这样的table
CREATE TABLE Content (
group_id bigint,
content_id bigint,
metadata blob,
group_payload blob static,
PRIMARY KEY (group_id, content_id)
你可以看到 group_payload
是静态的。如果我需要获取给定 group_id
我以前是这样做的
SELECT * FROM Content WHERE group_id = X;
然而,这让 group_payload
这会导致性能和内存问题,因为这是一个相当大的blob。
因此,我将查询分为2部分,如下所示
SELECT group_payload WHERE group_id = X limit 1;
SELECT metadata WHERE group_id = X;
这是一个奇迹般的性能改善,但它遭受了偶尔的比赛条件,即我得到了 group_payload
但是当我拿到 metadata
这个 group_payload
已经过时了。
有没有一种方法可以“批处理”这2个select查询。我是否应该捕获不一致性并重试(数据允许检测到这一点),或者有更好的方法来实现这一点?
谢谢
2条答案
按热度按时间sczxawaw1#
简短的回答-不-没有批处理
select
与cassandra一样,cassandra中的数据读取没有快照隔离。在您的情况下,我可能会考虑数据处理的逻辑—也许可以先获取所有元数据,然后获取组负载?
xmd2e60i2#
你将无法批量读取。如果读取元数据非常耗时,那么在读取元数据之后再读取有效负载。如果您想检查在获取元数据后有效负载是否更新,cassandra允许读写特定列的时间,但这看起来不是一个好的解决方案。
有趣的是,您的用例需要来自组的单个有效负载和来自组的所有元数据。另外,您正在读取单个分区的元数据,这应该需要几毫秒。如果您的负载更新如此频繁,那么您可以考虑过时但一致的(基于元数据和负载的写入时间)结果。