知识库

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 将开始减小,直到完全清空。

如果你不打算添加更多节点但仍想缩小数据库在磁盘上的大小,可以使用 存储复制工具。这个工具会读取一个离线数据库,将其复制到一个新的数据库,并忽略掉不再使用的数据(以及可供重复使用的 ID 列表)。

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

© . All rights reserved.