存储格式
Neo4j 的存储引擎支持多种存储格式,用于描述数据如何写入磁盘。block
格式是企业版推荐的格式,因为它具有卓越的性能和可扩展性。block
格式使用先进的数据结构和内联技术来增强数据局部性,从而提高资源利用率。
aligned
是社区版推荐的格式。
standard
和 high_limit
格式在 Neo4j 5.23 中已弃用。不建议将这些格式用于新数据库。有关这些格式弃用和最终移除时间线的更多信息,请参阅格式弃用。
有关 Neo4j 4.4 中存储格式的信息,请参阅Neo4j Admin 和 Neo4j CLI → Neo4j Admin → 显示存储信息。 |
可用存储格式
以下是可用格式及其功能的概述
- Block
-
企业版+
-
除非指定了
db.format
,否则为默认格式。 -
性能:查询速度快;使用先进的数据结构和内联技术,以获得更好的数据局部性。
-
内存效率:优化数据并置,允许通过更少的读操作获取更多相关数据;提高资源利用率。块格式意味着只需加载少量页面即可满足查询需求,即更少的页面错误和更少的 IO。
-
属性访问:属性与节点和关系一起存储在块中,大大减少了访问属性所需的指针追踪量。
-
实体限制:能够运行大规模图。支持截至本文撰写时的最高限制。详情请参阅Block 格式实体限制。
支持任意长度的令牌名称(包括标签、属性键和关系类型名称),最长可达 GQL 标识符的最大长度 16,383 个字符。 -
面向未来:设计为可扩展和改进,无需存储迁移。无需重写存储即可获得新功能(如数据类型)或性能增强。
-
- Aligned
-
-
社区版中的默认格式,以及 Neo4j 5.22 之前企业版中所有新数据库的默认格式。
-
性能:性能优于
standard
,但需要稍多一些磁盘空间。 -
内存效率:基于
standard
,但提高了内存效率。 -
属性访问:将图数据存储在磁盘上类似链表的结构中。
-
实体限制:支持在某些限制范围内的图。详情请参阅Aligned 格式实体限制。
-
- Standard
-
在 5.23 中弃用
-
性能:基本、基础格式。
-
属性访问:将图数据存储在磁盘上类似链表的结构中。
-
实体限制:支持在某些限制范围内的图。详情请参阅Standard 格式实体限制。
-
有关弃用和最终移除的信息,请参阅格式弃用。
-
- High_limit
-
企业版 在 5.23 中弃用
-
性能:性能略逊于
standard
,需要更多磁盘空间,但允许更多节点和关系。 -
内存效率:基于
standard
,但提高了内存效率。 -
属性访问:将图数据存储在磁盘上类似链表的结构中。
-
实体限制:在记录格式中,支持截至本文撰写时的最高限制。更多信息请参阅High_limit 格式实体限制。
-
有关弃用和最终移除的信息,请参阅格式弃用。
-
格式弃用
standard
和 high_limit
格式从 Neo4j 5.23 开始弃用。
block
格式比已弃用的格式提供更好的性能和可扩展性。它们将在 v5 和 vNext 服务器生命周期中保留为产品的一部分。包含这些格式的最后一个 Neo4j 版本将是 vNext.LTS,计划于 2026 年 11 月发布。Neo4j 的 LTS 版本在其发布后提供 3 年支持。这意味着对 standard
和 high_limit
格式的支持计划于 2029 年 11 月结束。
建议企业版用户尽早将所有数据库迁移到 block
格式,以确保最佳性能。更多信息请参阅更改现有数据库的存储格式。
- 常见问题
-
-
如何查询数据库的格式?
您可以使用 Cypher 命令SHOW DATABASES YIELD name, store
来获取数据库存储格式的信息。有关详细示例,请参阅显示特定数据库的详细信息。 -
standard
和high_limit
格式的支持何时结束?
包含这些格式的最后一个 Neo4j 版本将是计划于 2026 年 11 月发布的 LTS 版本,该版本将获得三年支持,直至 2029 年 11 月。 -
如何更改数据库的存储格式?
有关更改现有数据库存储格式的信息,请参阅更改现有数据库的存储格式。
-
如何设置数据库存储格式
您可以在创建新数据库时设置存储格式,也可以更改现有数据库的存储格式。
创建新数据库
block
是所有新创建数据库的默认格式,只要它们未指定 db.format
设置。
如果您想更改它,可以在 neo4j.conf 文件中为 db.format
配置设置一个新值。
您还可以通过将新格式作为参数传递给创建数据库的命令来创建特定存储格式的新数据库,例如 neo4j-admin database import full
或 neo4j-admin database copy
命令,或者在 Cypher 命令 CREATE DATABASE
中使用 storeFormat:
选项。
以下示例展示了如何创建 block
存储格式的新数据库。然而,这也适用于其他格式。
neo4j-admin database import full
命令导入数据库时指定存储格式bin/neo4j-admin database import full ... --format=block blockdb
neo4j-admin database copy
命令复制数据库时指定存储格式bin/neo4j-admin database copy --to-format="block" mydb blockdb
CREATE DATABASE
Cypher 语句创建新数据库时指定存储格式CREATE DATABASE blockdb OPTIONS {storeFormat: 'block'}
更改现有数据库的存储格式
block
格式是企业版的默认格式,因为它具有卓越的性能和可扩展性。因此,建议将所有数据库迁移到 block
格式,以确保最佳性能。block
格式支持任意长度的令牌名称(包括节点标签、属性键和关系类型名称),最长可达 GQL 标识符的最大长度 16,383 个字符。因此,从 aligned
迁移到 block
格式时,令牌名称必须遵守此长度限制。
standard
和 high_limit
格式在 5.23 中已弃用,并将在未来版本中移除。更多信息请参阅格式弃用。
请注意,更改存储格式会改变分配给节点和关系的内部 ID。这是因为 ID 代表元素在存储文件中的物理位置。 |
更改存储格式是一项 IO 密集型离线操作,它会以新格式重写所有数据。因此,它要求:
对于大型数据库,更改存储格式可能是一项耗时的操作,并且还需要重新填充所有索引。所需时间取决于数据库大小、索引数量、存储设备速度以及可用内存量。例如,一个 100GB 的数据库在最佳条件下可能需要 10 分钟,在最坏情况下可能需要一个多小时。因此,建议在备份上进行一次试运行,以估算迁移所需时间。 |
在独立服务器中
更改独立服务器中现有数据库的存储格式需要数据库处于离线状态。以下步骤假设您想将名为 mydb
的数据库迁移到 block
格式,但这些步骤也适用于其他格式。
-
使用 Cypher 命令
STOP DATABASE mydb
停止数据库。 -
使用以下任一选项更改已停止数据库的存储格式:
-
使用
neo4j-admin database migrate
命令迁移现有数据库。在运行
neo4j-admin database migrate
之前,无需使用--compact-node-store
选项运行neo4j-admin database copy
。在迁移过程中,数据库会进行固有的压缩。例如
bin/neo4j-admin database migrate --to-format="block" mydb
-
使用
neo4j-admin database copy
命令创建现有数据库副本时,将新存储格式作为参数传递。您还可以设置--copy-schema
选项以自动复制模式定义。例如bin/neo4j-admin database copy --to-format="block" mydb blockdb --copy-schema
-
-
成功完成后,使用 Cypher 命令
START DATABASE mydb
启动数据库。索引在数据库首次启动时填充,如果存在属性唯一性约束,这可能需要一些时间。
在集群中
更改集群中现有数据库的存储格式,需要您在一台服务器上恢复您想迁移的数据库的备份,然后,使用该服务器作为其他集群成员的指定种子节点,从该服务器复制数据库。
以下步骤假设您要将名为 mydb
的数据库迁移到 block
格式,但相同的步骤也适用于其他格式。该数据库以主模式托管在三台服务器上。
在其中一台服务器上,server01
-
在 Cypher Shell 中,使用 Cypher 命令
ALTER DATABASE databasename SET ACCESS READ ONLY
将要迁移的数据库置于只读模式。例如@system> ALTER DATABASE mydb SET ACCESS READ ONLY;
-
在命令行工具中,使用
neo4j-admin database backup
命令备份该数据库。例如bin/neo4j-admin database backup mydb --to-path=/path/to/your-backup-folder --include-metadata=all
-
回到 Cypher Shell,删除数据库以清除它以及所有与之相关的用户和角色
@system> DROP DATABASE mydb;
-
在命令行工具中,使用
neo4j-admin database restore
命令恢复您创建的备份bin/neo4j-admin database restore --from-path=/path/to/your-backup-folder/mydb-2024-03-05T11-26-38.backup mydb
-
将恢复的数据库迁移到
block
格式在运行
neo4j-admin database migrate
之前,无需使用--compact-node-store
选项运行neo4j-admin database copy
。在迁移过程中,数据库会进行固有的压缩。bin/neo4j-admin database migrate --to-format="block" mydb
-
在 Cypher Shell 中,运行
SHOW SERVERS
查找server01
的服务器 ID。交叉引用地址以找到服务器 ID。使用任何数据库进行连接。SHOW SERVERS YIELD serverId, name, address, state, health, hosting
在其中一台服务器上
-
使用
system
数据库并使用server01
的服务器 ID 创建已迁移的数据库mydb
。mydb
的拓扑结构存储在system
数据库中,当您创建它时,它会根据默认拓扑(可通过CALL dbms.showTopologyGraphConfig
显示)进行分配。更多信息请参阅指定种子节点。CREATE DATABASE mydb OPTIONS {existingData: 'use', existingDataSeedInstance: '<server01 id>'}
-
使用 Cypher 命令
SHOW DATABASE mydb
验证数据库是否已创建并可用。 -
成功完成后,恢复角色和权限。更多信息请参阅恢复用户和角色元数据。
验证存储格式
您可以使用以下 Cypher 命令验证数据库的存储格式
SHOW DATABASES YIELD name, store
+----------------------------------+ | name | store | +----------------------------------+ | "blockdb" | "block-block-1.1" | | "neo4j" | "record-aligned-1.1" | | "system" | "record-aligned-1.1" | +----------------------------------+
此外,您可以使用 neo4j-admin database info
命令获取数据库存储格式的详细信息。详情请参阅显示存储信息。
存储格式和实体限制
下表显示了不同存储格式的格式与 Neo4j 版本兼容性以及限制
Block 格式
名称 | 存储格式版本 | 引入于 | GA 版本始于 | 默认于 |
---|---|---|---|---|
|
|
|
|
|
名称 | 限制 |
---|---|
节点 |
|
关系 |
|
属性 |
|
标签 |
|
关系类型 |
|
属性键 |
|
Aligned 格式
名称 | 存储格式版本 | 引入于 | 默认于 | 不再支持自 |
---|---|---|---|---|
|
|
|
CE, EE < Neo4j 5.22 |
|
|
|
|
|
|
|
|
|
|
名称 | 限制 |
---|---|
属性键 |
|
节点 |
|
关系 |
|
属性 |
|
标签 |
|
关系类型 |
|
关系组 |
|
Standard 格式
有关弃用和最终移除的信息,请参阅格式弃用。
名称 | 存储格式版本 | 引入于 | 不再支持自 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
名称 | 限制 |
---|---|
属性键 |
|
节点 |
|
关系 |
|
属性 |
|
标签 |
|
关系类型 |
|
关系组 |
|
High_limit 格式
有关弃用和最终移除的信息,请参阅格式弃用。
名称 | 存储格式版本 | 引入于 | 不再支持自 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
名称 | 限制 |
---|---|
属性键 |
|
节点 |
|
关系 |
|
属性 |
|
标签 |
|
关系类型 |
|
关系组 |
|