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

时间:2018-04-27 05:13:06

标签: cassandra datastax-enterprise ttl

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

  1. 每次插入时玷污TTL
  2. 将表属性default_time_to_live设置为24小时。
  3. 我对这两件事情有一般的了解,但内部有哪些会对墓碑有所帮助?或两者都会产生相同数量的墓碑?哪一个会更好,为什么任何参考链接将被赞赏。

3 个答案:

答案 0 :(得分:5)

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

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

参考文献:

How data is deleted< - 良好的背景

CREATE TABLE properties< - 表属性引用

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

答案 1 :(得分:0)

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

使用TTL并不是那么有效,因为您将生成大量的逻辑删除,这取决于可能影响您的读取性能的数据量。

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

cassandra TTL for table behaviour

答案 2 :(得分:0)

如果您使用Go,那么GocqlX可以使用基于表模型的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
    }

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