理解 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 字节。显然,根据上面的注意事项,这在实际场景中可能并非如此简单。 |
-
节点数: 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
-
节点数: 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
您可以参考这些值来了解磁盘大小和增长的预期情况。
此页面有帮助吗?