知识库

Neo4j 中的删除操作

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

然而,一旦你开始删除节点,你就会发现 neostore.nodestore.db 文件的大小并没有减小。事实上,不仅大小保持不变,你还会看到 neostore.nodestore.db.id 文件开始增大,并且会持续增大以包含所有被删除的记录。

这是因为 ID 被重复使用。Neo4j 中的删除操作不会物理删除记录,而是将状态从 可用 更改为 不可用。我们将已删除的(但可重复使用)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 列表)。

大量删除操作会生成大量的交易日志。在执行大量删除操作时,你应该注意这一点,否则——具有讽刺意味的是——你的文件系统可能会被填满。