我有一些字段要存储到 Cassandra 中,但其中一些字段在任何给定点都可能为空。由于其中有很多,如果我在将每个代码添加到 INSERT 之前不检查每个代码是否为空,它会使代码更具可读性。
这样做有什么坏处吗?
编辑!!
我找到了一张 jira 票。但我无法理解票证最终实施了什么解决方案。 https://issues.apache.org/jira/browse/CASSANDRA-7304
我有一些字段要存储到 Cassandra 中,但其中一些字段在任何给定点都可能为空。由于其中有很多,如果我在将每个代码添加到 INSERT 之前不检查每个代码是否为空,它会使代码更具可读性。
这样做有什么坏处吗?
编辑!!
我找到了一张 jira 票。但我无法理解票证最终实施了什么解决方案。 https://issues.apache.org/jira/browse/CASSANDRA-7304
Cassandra 的新存储引擎的美妙之处在于它能够不存储值。它的意思就是它的本意:空值只是一个不应该存在的值。
这提供了极大的灵活性,因为未显式(或隐式,见下文)插入的空值不会占用存储空间,也不会使用处理能力和 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. 墓碑占用空间并且可以大大增加您需要的存储量。
2. 查询具有大量墓碑的表会导致性能问题,并导致延迟和堆压力。