是否可以从 Apache Cassandra 宽行中选择性地读取

Posted

技术标签:

【中文标题】是否可以从 Apache Cassandra 宽行中选择性地读取【英文标题】:Is it possible to Read selectively from a Apache Cassandra wide row 【发布时间】:2021-10-08 17:34:09 【问题描述】:

是否可以从 Apache Cassandra 行中选择性地读取?我听说“通常每次触发读取查询时都会在后台读取整行”。是否可以通过读取选择性列来减轻数据库引擎的压力?通过减少压力,我不是在谈论典型的避免选择 *,这将转化为更少的 IO 并使数据在网络上的移动更快;我说的是在提供结果之前,数据库引擎是否在内部将整行拉入内存?我对宽行很敏感,并希望我的阅读占用很小的空间。

我知道如何通过有选择地更新/写入您关心的列来避免完全写入。这个问题是非常具体的阅读。

【问题讨论】:

【参考方案1】:

是的,如果您只是对分区键而不是集群列进行过滤,则可以对行进行分页。

例如,像这样的视频 cmets 表:

CREATE TABLE video_comments (
    video_id text,
    comment_id text,
    username text,
    ...
    PRIMARY KEY (video_id, comment_id)
) WITH CLUSTERING ORDER BY (comment_id DESC)

对于具有 100K cmets 的视频,Cassandra 将在第一次通过时检索最新的 N cmets,因为驱动程序默认启用了分页(5000 行)。但是要对其余行进行分页,需要在堆上对分区进行序列化以遍历行,直到获得所需的子集。

如果您想避免加载大分区,则需要相应地对数据进行建模,以避免分区变得非常大(宽)。干杯!

【讨论】:

感谢 Erick 的快速评论。不过,我的想法更横向;如果我读取单行但仅选择 30 列中的 2 列,Cassandra 是将整行拉入内存还是仅将那 2 列拉入内存? 是的,确实如此。因为 C* 在检索磁盘之前不知道磁盘上有什么。干杯!

以上是关于是否可以从 Apache Cassandra 宽行中选择性地读取的主要内容,如果未能解决你的问题,请参考以下文章

Apache Cassandra - 从其他机器连接

valuelesscolumn的好坏

Cassandra 1.1 存储引擎如何存储复合材料?

Apache Cassandra vs Datastax Cassandra [关闭]

Cassandra 复合聚类键和排序查询

Cassandra 如何对静态列族进行排序