存储格式
Neo4j 的存储引擎支持多种存储格式,这些格式描述了数据如何写入磁盘。从 5.23 开始,block
格式是企业版推荐的格式,因为它具有卓越的性能和可扩展性。block
格式使用高级数据结构和内联技术来增强数据局部性,从而导致更好的资源利用率。
aligned
是社区版推荐的格式。
从 Neo4j 5.23 开始,standard
和 high_limit
格式已弃用。不建议将这些格式用于新数据库。有关这些格式的弃用和最终删除时间表的信息,请参阅 格式弃用。
可用存储格式
以下是可用格式及其功能的概述
- 块
-
企业版 Neo4j 5.16 中的 GA
-
从 Neo4j 5.22 开始,对于新数据库,默认格式为 (除非指定
db.format
)。 -
性能:快速查询;使用高级数据结构和内联技术以获得更好的数据局部性。
-
内存效率:数据优化共置,允许通过更少的读取操作获取更多相关数据;提高资源利用率。块格式意味着需要加载几个页面来服务查询,即更少的页面错误和更少的 IO。
-
属性访问:属性与其节点和关系一起存储在块中,从而大大减少了访问属性所需的指针追逐量。
-
实体限制:能够在大型规模上运行图。在撰写本文时,支持最高限制。有关详细信息,请参阅 块格式实体限制。
在 5.25 中引入 支持任何长度的令牌名称(包括标签、属性键和关系类型名称),最高可达 GQL 标识符最大长度 16,383 个字符。 -
未来证明: 设计为可扩展和改进,无需商店迁移。 新特性(如数据类型)或性能增强无需重写商店即可使用。
-
- 对齐
-
-
社区版中的默认格式,以及 Neo4j 5.22 之前企业版中的所有新数据库。
-
性能: 性能优于
standard
,但需要稍微更多的磁盘空间。 -
内存效率: 基于
standard
,但内存效率更高。 -
属性访问: 在磁盘上将图数据存储在类似链表的结构中。
-
实体限制: 支持在某些限制内的图。 有关详细信息,请参阅 对齐格式实体限制。
-
- 标准
-
在 5.23 中已弃用
- High_limit
-
企业版 在 5.23 中已弃用
-
性能: 性能略逊于
standard
,需要更多磁盘空间,但允许更多节点和关系。 -
内存效率: 基于
standard
,但内存效率更高。 -
属性访问: 在磁盘上将图数据存储在类似链表的结构中。
-
实体限制: 从记录格式来看,在编写时支持最高的限制。 有关详细信息,请参阅 High_limit 格式实体限制。
-
有关弃用和最终删除的信息,请参阅 格式弃用。
-
格式弃用
从 Neo4j 5.23 开始,standard
和 high_limit
格式已弃用。
block
格式比已弃用的格式提供更好的性能和可扩展性。 它们将在整个 v5 和 vNext 服务器生命周期内一直是产品的一部分。 包括这些格式的最后一个 Neo4j 版本将是计划于 2026 年 11 月发布的 vNext.LTS。 Neo4j 的 LTS 版本在发布后的 3 年内得到支持。 这意味着对 standard
和 high_limit
格式的支持计划于 2029 年 11 月结束。
建议企业版用户尽快将所有数据库迁移到 block
格式,以确保最佳性能。 有关详细信息,请参阅 更改现有数据库的存储格式。
- 常见问题解答
-
-
如何查找数据库的格式?
您可以使用SHOW DATABASES YIELD name, store
Cypher 命令获取有关数据库存储格式的信息。 有关详细示例,请参阅 显示特定数据库的详细信息。 -
对
standard
和high_limit
格式的支持何时结束?
包括这些格式的最后一个 Neo4j 版本将是计划于 2026 年 11 月发布的 LTS 版本,该版本将支持三年,直至 2029 年 11 月。 -
如何更改数据库的存储格式?
有关更改现有数据库存储格式的信息,请参阅 更改现有数据库的存储格式。
-
如何设置数据库存储格式
您可以在创建新数据库时设置存储格式,也可以更改现有数据库的存储格式。
创建新数据库
在 Neo4j 5.22 之前的版本中,所有新数据库的默认存储格式为 aligned
。 从 Neo4j 5.22 开始,block
是所有新创建数据库的默认格式,只要它们没有指定 db.format
设置。
如果要更改它,可以在 neo4j.conf 文件中为 db.format
配置设置新值。
您还可以通过将新格式作为参数传递给创建数据库的命令,例如 neo4j-admin database import full
或 neo4j-admin database copy
命令,或者通过使用 storeFormat:
选项在 Cypher 命令 CREATE DATABASE
中使用特定存储格式创建新数据库。
以下示例显示了如何在 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'}
更改现有数据库的存储格式
从 5.23 开始,block
格式是企业版的首选格式,因为它具有卓越的性能和可扩展性。 因此,建议将所有数据库迁移到 block
格式,以确保最佳性能。
请注意,更改存储格式会更改分配给节点和关系的内部 ID。 这是因为 ID 代表元素在存储文件中的物理位置。 |
更改存储格式是一个 I/O 密集型离线操作,它会以新格式重新写入所有数据。 因此,它需要
对于大型数据库,更改存储格式可能是一个耗时的操作,并且还需要重新填充任何索引。 所需时间取决于数据库的大小、索引数量、存储设备的速度以及可用内存量。 例如,一个 100GB 的数据库在最佳条件下可能需要 10 分钟,在最坏情况下可能需要一个多小时。 因此,建议对备份进行干运行,以估计迁移所需的时间。 |
在独立服务器中
在独立服务器中更改现有数据库的存储格式需要将数据库脱机。 以下步骤假设您要将名为 mydb
的数据库迁移到 block
格式,但相同步骤也适用于其他格式。
-
使用 Cypher 命令
STOP DATABASE mydb
停止数据库。 -
使用以下选项中的一个更改已停止数据库的存储格式
-
使用
neo4j-admin database migrate
命令迁移现有数据库。在运行
neo4j-admin database migrate
之前,您无需运行neo4j-admin database copy
以及--compact-node-store
选项。 在迁移过程中,数据库会自动进行压缩。例如
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
之前,您无需运行neo4j-admin database copy
以及--compact-node-store
选项。 在迁移过程中,数据库会自动进行压缩。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 版本兼容性以及不同存储格式的限制
块格式
名称 | 存储格式版本 | 引入于 | GA 自 | 默认在 |
---|---|---|---|---|
|
|
|
|
|
名称 | 限制 |
---|---|
节点 |
|
关系 |
|
属性 |
|
标签 |
|
关系类型 |
|
属性键 |
|
对齐格式
名称 | 存储格式版本 | 引入于 | 默认在 | 从以下版本开始不支持 |
---|---|---|---|---|
|
|
|
CE、EE < Neo4j 5.22 |
|
|
|
|
|
|
|
|
|
|
名称 | 限制 |
---|---|
属性键 |
|
节点 |
|
关系 |
|
属性 |
|
标签 |
|
关系类型 |
|
关系组 |
|
标准格式
有关弃用和最终删除的信息,请参阅 格式弃用。
名称 | 存储格式版本 | 引入于 | 从以下版本开始不支持 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
名称 | 限制 |
---|---|
属性键 |
|
节点 |
|
关系 |
|
属性 |
|
标签 |
|
关系类型 |
|
关系组 |
|
高限制格式
有关弃用和最终删除的信息,请参阅 格式弃用。
名称 | 存储格式版本 | 引入于 | 从以下版本开始不支持 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
名称 | 限制 |
---|---|
属性键 |
|
节点 |
|
关系 |
|
属性 |
|
标签 |
|
关系类型 |
|
关系组 |
|