TTL 与 default_time_to_live 哪个更好,为什么?

TTL vs default_time_to_live which one is better and why?

要求很简单:我们必须创建一个只有 24 小时数据的 table。 我们有两个选择

  1. 每次插入都会破坏 TTL
  2. 制作table属性default_time_to_live24小时。

我对这两件事都有大致的了解,但在内部哪一个有助于处理墓碑?或者两者都会产生相同数量的墓碑?哪一个会更好以及为什么任何参考 link 将不胜感激。

如果使用Cassandra 3.0还可以定义物化视图,详见:https://docs.datastax.com/en/cql/3.3/cql/cql_using/useCreateMV.html

使用 TTL 不是那么有效,因为您会生成大量墓碑,这取决于数据量可能会影响您的读取性能。

此外,我认为您关于 TTL 的问题已在此处得到解答:

cassandra TTL for table behaviour

如果 table 上有 default_time_to_live,则超过此时间限制的行将立即删除,而不会写入墓碑。这不会影响在其上设置了显式 TTL 的行/列。这些将被立碑。

如果您沿着 TTL 路线走,那么您应该考虑将 table 上的 gc_grace_seconds 属性 设置为小于默认值(10 天)的值。特别是如果您正在查看 24 小时 TTL。

参考文献:

How data is deleted <-- 背景不错

CREATE TABLE properties <-- Table 属性 参考

About Deletes and Tombstones in Cassandra <-- 你想知道的关于删除和墓碑的一切

如果您使用的是 Go,那么 GocqlX 使用基于 table 模型的 RewriteRows 函数解决了这个问题。

https://github.com/scylladb/gocqlx/commit/13ef8ceaf1c1661ec51459347e6b2aea6e59037c

示例:

    if err := session.ExecStmt("ALTER TABLE XXXXX WITH default_time_to_live = 0"); err != nil {
        return err
    }
    if err := table.RewriteRows(session, myGocqlXTableModelForXXXXX); err != nil {
        return err
    }

对于大 table,您应该使用 efficient full table scan 加上此技术。