我的问题是,cassandra在插入NULL值时会创建墓碑。
据我了解,cassandra不支持NULL,而当插入NULL时,它将删除相应的列。一方面,这非常节省空间,但另一方面,它会创建逻辑删除,从而降低读取性能。
这再次成为NoSql的哲学,因为cassandra节省了空间但降低了读取性能。在NoSql世界中,空间便宜,但是性能很重要。我相信这是将表格以非规范化形式保存的背后的哲学。
我希望cassandra使用与插入任何其他值相同的技术插入NULL-使用时间戳记并在压缩期间保留最新的条目-即使该条目为NULL(或者我们可以将其称为“未设置”)。 在cassandra配置中是否有任何调整或任何方法,我如何能够在没有逻辑删除的情况下实现具有null的upserts?
我遇到了this issue,但是它只能忽略NULL值
我的用例: 我有事件流,每个事件都由causeID标识。我收到许多具有相同causeID的事件,并且我只想存储具有相同causeID的最新事件(使用upsert)。事件的属性可以从NULL更改为特定值,也可以从特定值更改为NULL。不幸的是,后一种情况会生成逻辑删除并降低读取性能。
更新
看来我无法避免墓碑。您能在最小化技术方面给我建议吗(将gc_grace_seconds设置为非常低的值)。有什么风险?当节点宕机的时间超过gc_grace_seconds的时间,怎么办?
答案 0 :(得分:2)
您不能在cassandra中插入NULL-在那里有特殊含义,并导致您观察到的墓碑的创建。如果要将NULL当作特殊值,为什么不在应用程序端解决此问题-当您获得null
状态时,只需插入表中无法使用的特殊值以及读取数据时返回,检查该特殊值并将null
输出到请求者...
答案 1 :(得分:1)
如果您在INSERT中特别提到NULL,则无法避免墓碑。 C *在插入或写入数据之前不会进行查找,这会使写入非常快。为此,C *只是插入一个逻辑删除,以免以后再使用该值(采用最新的比较时间戳)。如果要避免使用逻辑删除(建议使用逻辑删除),则必须准备不同的查询组合以将每个查询都检查为NULL,然后再将其添加到INSERT。如果您要检查的字段很少,那么只需添加一些IF-ELSE语句即可。但是,如果它们很多,代码将变得更大且可读性更差。不久,您将无法插入NULL,这将在以后影响读取性能。