【图数据库内核】Neo4j Block format:128 B 主块、动态溢出与 dense B+ 树

💡 原文中文,约7300字,阅读约需18分钟。
📝

内容提要

本文介绍Neo4j图数据库的Block存储格式,采用128字节固定主块内联节点与关系数据,溢出时分层使用动态存储、dense B+树及huge存储。相比Record系指针链,Block减少指针追逐,提升局部性,支持更高实体上限,但空节点有固定空间开销。该格式为Enterprise默认,Community仍用aligned。

🔎

延伸解读

固定主块的空间税

Block 格式为每个节点分配固定 128 字节主块,即使节点几乎为空也持续占用,直到删除。这意味着小度数、低填充的图会付出显著的空间开销,这是用空间换取数据局部性的显式取舍。对于包含大量空壳节点的超大规模图,这种固定开销可能不友好;而对于真实业务节点(带几条边和属性),则能受益于共置带来的局部性提升。

类型级溢出:更细粒度的 dense 处理

与 record 系中节点要么整体 sparse 要么整体 dense 不同,block 格式允许同一节点的不同关系类型分别存储:部分类型可留在 x1 或 xd,其他类型溢出到 dense B+ 树。分界在类型级,且同一类型的所有关系始终在同一 store,不跨层拆分。这种设计使得超节点的处理更灵活,避免整点翻转带来的不必要开销。

版本与版本差异:EE 与 CE 默认不同

Block 格式自 5.14 引入,5.16 GA,5.22 起成为 Enterprise 新建库的默认格式(未指定时),而 Community 默认仍是 aligned。手册明确将 block 标为 Enterprise 能力路径。因此,读者需先确认自己的版本和 edition,避免假设开源 Community 与 EE 有相同默认。迁移时,从 block 迁回 aligned 不推荐,且受限于 aligned 更低的实体上限。

Q&A

Neo4j的Block存储格式中,主块的大小是多少?

Neo4j的Block存储格式中,主块(small store)的大小固定为128字节,每个块内包含两个64字节的记录,分别用于节点数据和关系数据。

Neo4j Block格式中,节点或关系数据超过主块容量时如何处理?

当节点或关系数据超过主块容量时,会使用动态存储(dynamic stores),包括block.node.xd.db、block.relationship.xd.db和block.big_values.db。动态存储可以自适应调整大小,最大分别可达8192字节、2047字节和8192字节。如果关系数据超过动态关系记录上限,则溢出到dense B+树(block.relationship.dense.db)。

Neo4j Block格式中,dense B+树的作用是什么?

dense B+树用于存储超多关系(超过动态关系记录上限)的节点。每个节点在block.relationship.dense.db中拥有一棵B+树,树内按关系类型和方向排序,支持按类型和方向快速定位关系。同一类型的所有关系始终存储在同一个store中,且单点dense关系数无上界。

Neo4j Block格式相比Record格式的主要优势是什么?

Block格式的主要优势是减少指针追逐(pointer chasing),提高数据局部性。通过将节点和关系数据内联在128字节的主块中,一次读取可以获取更多相关数据,减少页故障(page fault)次数。而Record格式使用指针链,需要多次随机访问。

Neo4j Block格式中,属性值小于多少字节时会被内联存储?

编码后总大小小于约31字节的属性值会被内联存储在small store或dynamic store的节点或关系数据中,而大于等于31字节的属性值则存储在block.big_values.db中。

Neo4j Block格式的实体上限是多少?

Block格式的实体上限为:节点数可达2^48,关系数和属性数无定义上界,标签数可达2^31,关系类型数可达2^30,属性键数可达2^31。相比Record格式(节点/关系约2^35,关系类型仅2^16),上限更高。

Neo4j Block格式是默认格式吗?

Block格式是Neo4j Enterprise Edition的默认格式(从5.22.0起,新建数据库默认使用block格式),而Community Edition默认仍使用aligned格式。

Neo4j Block格式中,空节点会占用多少空间?

即使节点几乎为空,每个节点在small store中仍会占用固定的128字节主块,直到节点被删除。这是Block格式用空间换局部性的显式取舍。

🏷️

标签

➡️

继续阅读