Cassandra 简单的主键查询

Posted

技术标签:

【中文标题】Cassandra 简单的主键查询【英文标题】:Cassandra simple primary key queries 【发布时间】:2019-03-23 04:59:27 【问题描述】:

我们想创建一个带有简单主键的 Cassandra 表,该表由 UUID 列组成。 该表将如下所示:CREATE TABLE simple_table( id UUID PRIMARY KEY, col1 text, col2 text, col3 UUID );

此表可能会存储数十亿行,并且使用 TTL 功能,这些行应该会在一段时间(几个月)后过期。 关于这张表的效率,我有几个问题:

    使用主键查询该表的效率如何?意思是,Cassandra 在解析它所在的分区后如何找到特定的行? 考虑到行将过期并创建许多墓碑,这将如何影响对该表的读取和写入?假设我们在 180 天后过期数据,如果我没记错的话,墓碑的比例将是 10/180~=0.056(当 10 是 gc_grace_periods 时)。

【问题讨论】:

【参考方案1】:

在您的情况下,主键等于分区键,因此您有所谓的“瘦”分区,由一行组成。如果您删除数据,那么您将只有墓碑,而不是分区内的数据,这不是问题。如果数据过期,那么它会在压缩过程中被简单地删除 - gc_grace_period 不适用这里 - 只有当你明确删除数据时才需要 - 我们需要保留墓碑,因为其他节点可能需要“赶上”如果他们无法接收删除操作,则更改。您可以在following document中找到有关数据删除的更多详细信息。

当您在同一分区中有许多(数千)行时,就会出现墓碑问题,例如,如果您使用多个集群键。而当这些数据被删除时,就会生成墓碑,当我们读取分区内的数据时应该跳过。

附:你看过这个blog post 解释删除是如何发生的吗?

【讨论】:

感谢您的回答,我还没有读过这个博客,但我现在一定会读的。我的第一个问题呢? Cassandra 如何在 Node 中找到这个单行分区?我猜很多单行分区会在同一个 SSTable 文件中。【参考方案2】:

在阅读了@Alex 推荐给我的博客(和 cmets)之后,我得出的结论是,由于表的 default_time_to_live,为过期行创建了墓碑。 只有在gc_grace_periods 过去之后,这些墓碑才会被清理。请参阅此stack overflow question。 关于我的第一个问题,datastax page 描述得很好。

【讨论】:

以上是关于Cassandra 简单的主键查询的主要内容,如果未能解决你的问题,请参考以下文章

cassandra中的主键是唯一的吗?

尝试使用 C# 中的 Guid 作为 Cassandra 中的主键

在cassandra的主键上匹配'like'的模式

Cassandra 数据如何更新

Cassandra 边界框搜索

Cassandra:如何使用数学运算符查询主键,例如>,<这是文本类型?