Neo4j 不同的存储格式(store formats)的差异
参考官方:https://neo4j.com/docs/operations-manual/5/database-internals/store-formats/
Neo4j 存储格式概述
Neo4j 使用不同的存储格式(store formats)来将图数据持久化到磁盘上,每种格式针对特定的性能、容量和可扩展性需求进行了优化。截至 Neo4j 5.x 版本(2026 年 1 月,5.23 版本已发布),支持的格式包括 block、aligned、standard 和 high_limit。其中,block 格式是 Neo4j 5.22 及以后版本中 Enterprise Edition 新建数据库的推荐默认格式,具有最佳性能(基于块存储和数据内联)。aligned 格式是 Community Edition 和早期 Enterprise Edition 的默认格式。standard 和 high_limit 格式自 Neo4j 5.23 起已被弃用,不推荐用于新数据库,支持将于 2029 年 11 月结束。
这些格式的主要区别在于数据结构、实体容量上限、ID 分配方式、性能表现、磁盘占用以及迁移路径。以下详细说明每种格式,所有信息请以 Neo4j 官方文档(Operations Manual 5 版)的 Store formats 章节 及其子页面内容为准。
1. Block 格式
- 格式版本:block-block-1.1
- 引入版本:Neo4j 5.14(5.16 正式 GA)
- 默认使用场景:Neo4j 5.22 及以后 Enterprise Edition 新建数据库(除非通过 db.format 配置覆盖)
- 可用版本:仅 Enterprise Edition
- 数据结构:基于块(block)的存储,采用内联(inlining)技术。属性与节点、关系共置于块中,提升数据局部性,减少指针跳转。与基于记录(record)的格式(链表式结构)形成对比。
- 实体容量限制:
- 节点:最高 2⁴⁸(约 281 万亿)
- 关系:无限制
- 属性:无限制
- 标签:最高 2³¹(约 21 亿)
- 关系类型:最高 2³⁰(约 10 亿)
- 属性键:最高 2³¹(约 21 亿)
- ID 分配:内部 ID 表示数据在存储文件中的物理位置。迁移到或从该格式时 ID 会被重新分配,可能导致外部引用 ID 的应用失效。
- 性能表现:所有格式中最高,缓存效率高、页面故障少、I/O 操作少,适合高性能和大尺度图查询。
- 磁盘占用:高效,开销最小。
- 推荐使用场景:所有新 Enterprise Edition 数据库,尤其是需要高性能、可扩展性和内存效率的生产环境。
- 迁移:可从 aligned、standard(以及有限情况下 high_limit)迁移而来。使用 neo4j-admin database migrate --to-format=“block” 离线执行,需要约 1 倍数据库大小的空闲磁盘空间,迁移后需重新填充索引。
2. Aligned 格式
- 格式版本:record-aligned-1.1
- 引入版本:Neo4j 5.0
- 默认使用场景:Community Edition 数据库及 Neo4j 5.22 之前创建的 Enterprise Edition 数据库
- 可用版本:Community 和 Enterprise Edition
- 数据结构:基于记录,增加了对齐(alignment)优化,提升内存效率。数据以链表式结构存储,但记录带有填充以对齐边界。
- 实体容量限制:
- 节点:最高 2³⁵(约 343 亿)
- 关系:最高 2³⁵(约 343 亿)
- 属性:最高 2³⁶(约 687 亿)
- 标签:最高 2³¹(约 21 亿)
- 关系类型:最高 2¹⁶(65,536)
- 属性键:最高 2²⁴(约 1678 万)
- 关系组:最高 2³⁵(约 343 亿)
- ID 分配:ID 对应存储文件中的物理偏移。迁移时重新分配。
- 性能表现:优于 standard,但由于链表指针跳转,仍逊于 block。
- 磁盘占用:因对齐填充略高于 standard。
- 推荐使用场景:Community Edition 或旧 Enterprise 数据库,适用于容量在限制内的中等负载。
- 迁移:可迁移至 block(推荐)或 high_limit(不推荐)。过程离线且 I/O 密集。
3. Standard 格式
- 格式版本:record-standard-1.1
- 引入版本:Neo4j 5.0(从早期版本演进)
- 默认使用场景:旧版本数据库,非当前默认
- 可用版本:Community 和 Enterprise Edition
- 弃用状态:自 Neo4j 5.23 起弃用,将在下一个 LTS 版本(预计 2026 年 11 月)后移除支持
- 数据结构:基础记录存储,无对齐优化,纯链表式结构。
- 实体容量限制:与 aligned 相同(节点/关系 2³⁵,属性 2³⁶ 等)
- ID 分配:物理位置 ID,迁移时重新分配。
- 性能表现:基础水平,指针跳转导致较高延迟。
- 磁盘占用:记录格式中最低。
- 推荐使用场景:仅用于遗留兼容,不建议新建。应迁移至 block 或 aligned。
- 迁移:可迁移至 aligned、block 或 high_limit(后者不推荐)。
4. High-Limit 格式
- 格式版本:record-high_limit-1.1
- 引入版本:Neo4j 5.0(从早期版本演进)
- 默认使用场景:从不默认,必须显式指定
- 可用版本:仅 Enterprise Edition
- 弃用状态:自 Neo4j 5.23 起弃用,同 standard
- 数据结构:记录格式,针对极端容量设计,使用更宽的 ID 和额外开销。
- 实体容量限制:
- 节点:最高 2⁵⁰(约 1 万亿亿,即 1 quadrillion)
- 关系:最高 2⁵⁰
- 属性:最高 2⁵⁰
- 标签:最高 2³¹(约 21 亿)
- 关系类型:最高 2²⁴(约 1678 万)
- 属性键:最高 2²⁴(约 1678 万)
- 关系组:最高 2⁵⁰
- ID 分配:更宽位分配的物理位置 ID,迁移时重新分配。
- 性能表现:因容量开销略差于 standard。
- 磁盘占用:所有格式中最高。
- 推荐使用场景:仅用于超出其他格式容量的极端大图;已弃用,应迁移至 block(注意 block 容量虽高但非无限)。
- 迁移:仅可迁移至 block(迁移前会检查是否符合 block 容量限制)。
格式对比总结表
| 特性 | Block 格式 | Aligned 格式 | Standard 格式 | High-Limit 格式 |
| 数据结构 | 块存储 + 内联 | 记录 + 对齐 | 基础记录 | 记录 + 高容量设计 |
| 最大节点数 | 2⁴⁸(281 万亿) | 2³⁵(343 亿) | 2³⁵(343 亿) | 2⁵⁰(1 万亿亿) |
| 最大关系数 | 无限制 | 2³⁵(343 亿) | 2³⁵(343 亿) | 2⁵⁰(1 万亿亿) |
| 最大属性数 | 无限制 | 2³⁶(687 亿) | 2³⁶(687 亿) | 2⁵⁰(1 万亿亿) |
| 关系类型数 | 2³⁰(10 亿) | 2¹⁶(65,536) | 2¹⁶(65,536) | 2²⁴(1678 万) |
| 属性键数 | 2³¹(21 亿) | 2²⁴(1678 万) | 2²⁴(1678 万) | 2²⁴(1678 万) |
| 性能 | 最佳(低 I/O、高缓存效率) | 良好 | 基础 | 略差于 standard |
| 磁盘占用 | 高效 | 中等(对齐开销) | 最低 | 最高(容量开销) |
| 状态 | 活跃,Enterprise 推荐 | 活跃,Community 默认 | 已弃用(5.23) | 已弃用(5.23) |
| 可用版本 | 仅 Enterprise | Community & Enterprise | Community & Enterprise | 仅 Enterprise |
| ID 分配 | 物理位置,迁移重分配 | 物理位置,迁移重分配 | 物理位置,迁移重分配 | 物理位置,迁移重分配 |
| 可迁移目标 | N/A(目标格式) | 到 block 或 high_limit | 到 aligned、block 或 high_limit | 仅到 block |
附加说明
- 查看当前格式:使用 Cypher SHOW DATABASES YIELD name, store 或命令行 neo4j-admin database info <database>。
- 设置格式:新建数据库时通过 neo4j.conf 中的 db.format 配置,或在创建/导入时指定。
- 弃用影响:standard 和 high_limit 将于 2029 年 11 月后失去支持,Enterprise 用户强烈建议迁移至 block以获得性能提升。