知识库

理解 Neo4j 磁盘上的数据

Neo4j 数据库文件被持久化到存储中以实现长期耐久性。数据相关文件默认位于 Neo4j 数据目录下的 data/databases/graph.db (v3.x+) 中。下面将介绍您会发现的文件类型,这些文件以 neostore.* 为前缀,并说明它们存储的数据。

  • nodestore* 存储图中的节点相关数据

  • relationship* 存储图中创建和定义的关系相关数据

  • property* 存储数据库中的键/值属性

  • label* 存储图中索引相关的标签数据

由于 Neo4j 是一个无模式数据库,我们使用固定记录长度来持久化数据,并根据这些文件中的偏移量来知道如何获取数据以响应查询。下表说明了 Neo4j 用于存储 Java 对象类型的固定大小。

Store File                        | Record size   | Contents
----------------------------------------------------------------------------------------------------------------------------
neostore.nodestore.db             | 15 B          | Nodes
neostore.relationshipstore.db     | 34 B          | Relationships
neostore.propertystore.db         | 41 B          | Properties for nodes and relationships
neostore.propertystore.db.strings | 128 B         | Values of string properties
neostore.propertystore.db.arrays  | 128 B         | Values of array properties
Indexed Property                  | 1/3 * AVG(X)  | Each index entry is approximately 1/3 of the average property value size
关于属性的一些注意事项
  • 属性记录的有效载荷为 32 字节,分为四个 8 字节块。每个字段可以存储键或值,或者同时存储键和值。

  • 键和类型占用 3.5 字节(键 4 位,类型 24 位)

  • boolean, byte, short, int, char, float 适合于该同一块中的剩余字节

  • 一个 small long 也适合于同一块中

  • 一个 big long 或 double 存储在单独的块中(意味着该属性使用了两个块)

  • 对字符串存储或数组存储的引用适合于与键相同的块中

  • 如果 short string 或 short array 适合于剩余块中(包括键块的剩余字节),则存储在同一记录中

  • 不适合 8 字节块的 long strings/arrays 将有一个指向字符串/数组存储中记录的指针 (128B)

  • …​ 其他类型更复杂!

存储在磁盘上的数据都是固定大小记录的链表。属性存储为属性记录的链表,每个记录包含键和值,并指向下一个属性。每个节点和关系都引用其第一个属性记录。节点也引用其关系链中的第一个关系。每个关系都引用其起始节点和结束节点。它还分别引用起始节点和结束节点的上一个和下一个关系记录。

 

一个基本的磁盘空间计算示例可能如下所示

为了简单起见,我们假设属性与属性记录的比例为 1:1,这意味着单个属性始终为 41 字节。显然,根据上面的注意事项,这在实际场景中可能并非如此简单。

场景 #1 - 初始状态
  • 节点数: 400 万节点

    • 每个节点有 3 个属性 (总共 1200 万属性)

  • 关系数: 200 万关系

    • 每个关系有 1 个属性 (总共 200 万属性)

 

这转换为磁盘上的以下大小
  • 节点: 4.000.000x15B = 60.000.000B (60MB)

  • 关系: 2.000.000x34B = 68.000.000B (68MB)

  • 属性: 14.000.000x41B = 574.000.000B (574MB)

  • 总计: 703MB

 

场景 #2 - 4 倍增长 + 添加属性 + 所有属性上的索引
  • 节点数: 1600 万节点

    • 每个节点有 5 个属性 (总共 8000 万属性)

  • 关系数: 800 万关系

    • 每个关系有 2 个属性 (总共 1600 万属性)

 

这转换为磁盘上的以下大小
  • 节点: 16.000.000x15B = 240.000.000B (240MB)

  • 关系: 8.000.000x34B = 272.000.000B (272MB)

  • 属性: 96.000.000x41B = 3.936.000.000B (3936MB)

  • 索引: 4448MB * ~33% = 1468MB

  • 总计: 5916MB

 

您可以参考这些值来了解磁盘大小和增长的预期情况。

© . All rights reserved.