Cassandra 简单的主键查询
Cassandra simple primary key queries
我们想创建一个 Cassandra table,它具有由 UUID 列组成的简单主键。
table 看起来像:
CREATE TABLE simple_table(
id UUID PRIMARY KEY,
col1 text,
col2 text,
col3 UUID
);
这 table 可能会存储数十亿行,使用 TTL 功能这些行应该会在一段时间(几个月)后过期。
我对 table:
的效率没有什么疑问
- 使用主键对此 table 进行查询的效率如何?意思是,Cassandra 如何在解析它所在的分区后找到特定的行?
- 考虑到行将过期并创建许多墓碑,这将如何影响对此 table 的读写?假设我们的数据在 180 天后过期,如果我没记错的话,墓碑的比例将是 10/180~=0.056(当 10 是 gc_grace_periods 天数时)。
在你的例子中,主键等于分区键,所以你有所谓的 "skinny" 分区,由一行组成。如果您删除数据,那么您将只有墓碑,而不是分区内的数据,这不是问题。如果数据已过期,那么它将在压缩期间被简单地删除 - gc_grace_period
未在此处应用 - 仅当您明确删除数据时才需要 - 我们需要保留墓碑,因为其他节点可能需要 "catch up" 如果他们无法接收删除操作,则进行更改。您可以在 following document.
中找到有关数据删除的更多详细信息
当您在同一分区中有许多(数千)行时,例如,如果您使用多个集群键,就会出现墓碑问题。而当这些数据被删除时,就会产生墓碑,当我们读取分区内的数据时应该跳过。
P.S。您看过这个 blog post 解释删除是如何发生的吗?
阅读@Alex 推荐我的博客(和评论)后,我得出结论,由于 table 的 default_time_to_live
,墓碑是为过期行创建的。
只有在 gc_grace_periods
过去后,这些墓碑才会被清理。看到这个 。
关于我的第一个问题,datastax page 描述得很好。
我们想创建一个 Cassandra table,它具有由 UUID 列组成的简单主键。
table 看起来像:
CREATE TABLE simple_table(
id UUID PRIMARY KEY,
col1 text,
col2 text,
col3 UUID
);
这 table 可能会存储数十亿行,使用 TTL 功能这些行应该会在一段时间(几个月)后过期。 我对 table:
的效率没有什么疑问- 使用主键对此 table 进行查询的效率如何?意思是,Cassandra 如何在解析它所在的分区后找到特定的行?
- 考虑到行将过期并创建许多墓碑,这将如何影响对此 table 的读写?假设我们的数据在 180 天后过期,如果我没记错的话,墓碑的比例将是 10/180~=0.056(当 10 是 gc_grace_periods 天数时)。
在你的例子中,主键等于分区键,所以你有所谓的 "skinny" 分区,由一行组成。如果您删除数据,那么您将只有墓碑,而不是分区内的数据,这不是问题。如果数据已过期,那么它将在压缩期间被简单地删除 - gc_grace_period
未在此处应用 - 仅当您明确删除数据时才需要 - 我们需要保留墓碑,因为其他节点可能需要 "catch up" 如果他们无法接收删除操作,则进行更改。您可以在 following document.
当您在同一分区中有许多(数千)行时,例如,如果您使用多个集群键,就会出现墓碑问题。而当这些数据被删除时,就会产生墓碑,当我们读取分区内的数据时应该跳过。
P.S。您看过这个 blog post 解释删除是如何发生的吗?
阅读@Alex 推荐我的博客(和评论)后,我得出结论,由于 table 的 default_time_to_live
,墓碑是为过期行创建的。
只有在 gc_grace_periods
过去后,这些墓碑才会被清理。看到这个
关于我的第一个问题,datastax page 描述得很好。