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 简单的主键查询的主要内容,如果未能解决你的问题,请参考以下文章