将空值插入cassandra

时间:2016-11-21 06:01:32

标签: cassandra cql tombstone

我有一些字段存储在Cassandra中,但有些字段在任何给定点都可以为null。由于它们中有很多,如果我在将它们添加到INSERT之前不检查每个代码是否为null,它会使代码更具可读性。

这样做有什么害处吗?

EDIT !!

我找到了一张jira票。但我无法理解最终从故障单中实现了什么解决方案。 https://issues.apache.org/jira/browse/CASSANDRA-7304

2 个答案:

答案 0 :(得分:10)

Cassandra的新存储引擎的美妙之处在于 NOT 存储值的能力。它意味着什么: null 值只是一个不应该存在的值。

这提供了很大的灵活性,因为未显式(或隐式地,见后面)插入的空值不会占用存储空间,也不会使用处理能力和IO带宽。

实际上,使用空值填充行非常容易:

INSERT INTO mytable (pk, c2, c3) VALUES (0x1234, null, null);

通过这种方式,您明确告诉C *在c2和c3中都存储空值。但是,您可以使用以下方法获得相同的宏观效果:

INSERT INTO mytable (pk) VALUES (0x1234);

请注意,我说宏观效果,因为当您明确插入空值时,C * 插入一个墓碑。从长远来看,由于C *如何执行搜索,压缩等等,这会让你感到痛苦......所以你应该尽可能避免,第二个版本会表现得更好。

现在,还有一个陷阱:您还可以创建隐式的逻辑删除。当您使用Cassandra中内置的 TTL 功能时,会发生

总之,如果你关心自己,我建议不要执行任何空值插入。在应用程序级别进行检查,您将在以后节省时间(和金钱),例如在阅读期间。

答案 1 :(得分:9)

插入空值会创建一个墓碑。
你不应该创建墓碑
1.墓碑占用空间,可以大大增加你需要的存储空间 2.查询具有大量逻辑删除的表会导致性能问题,并导致延迟和堆压力。