知识库

Neo4j 中的删除是如何工作的

Neo4j 使用逻辑删除来从数据库中删除数据,以实现最高的性能和可扩展性。为了了解这对数据库管理员的表现如何,我们以向 Neo4j 加载数据的简单案例来说明。当你开始加载数据时,可以看到节点被存储在名为 neostore.nodestore.db 的文件中。随着持续加载,文件会不断增大。

然而,一旦开始删除节点,你会发现文件 neostore.nodestore.db 的大小并不会缩小。事实上,大小保持不变,同时你会看到文件 neostore.nodestore.db.id 不断增长——对所有被删除的记录都会如此。

之所以出现这种情况是因为 ID 的复用。Neo4j 中的删除并不会真正物理删除记录,而是将位从available(可用)切换为unavailable(不可用)。被删除(但可复用)的 ID 会保存在 neostore.nodestore.db.id 中。这意味着 neostore.nodestore.db.id 文件类似于一个“回收站”,用于存放所有已删除的 ID。

现在你已经删除了数据,neostore.nodestore.db 的大小与删除前相同,但 neostore.nodestore.db.id 文件比删除操作前更大。如何重新回收这些空间?

当在删除之后开始加载新数据时,Neo4j 会使用 neostore.nodestore.db.id 中记录的 ID,因此 neostore.nodestore.db 文件的大小不会再增长,而 neostore.nodestore.db.id 文件则会逐渐减少,直至完全为空。

如果你不打算再添加节点,但仍想减小磁盘上数据库的大小,可以使用 copy store util。该工具会读取离线数据库,将其复制到新库,并剔除不再使用的数据(以及可复用 ID 列表)。

大规模删除可能会产生大量事务日志。执行批量删除操作时需要注意,否则——讽刺的是——文件系统可能会被填满。

© . This site is unofficial and not affiliated with Neo4j, Inc.