基于文件的数据库 - HSQLDB:35 MB,H2:85 MB

File based DB - HSQLDB: 35 MB, H2: 85 MB

我在数据库中存储了 500.000 条记录,每条记录大约 50 个字符。每小时清除一次数据库并插入 500k 条记录。

我通常更喜欢 H2,但我不明白为什么 database.mv 有 85 MB 大(在清除和恢复后甚至有 200 MB)。 我也试过 hsqldb,它一直只使用 35 MB。

我使用 spring 具有以下特性的靴子: H2:

spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:file:./h2
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

HSQLDB:

spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver
spring.datasource.url = jdbc:hsqldb:file:data
spring.datasource.username=sa
spring.datasource.password=

你的问题是什么?

您在 H2 中使用持久数据库。 H2 有两个存储后端。默认是基于 MVStore 的,它更适合数据竞争高的多线程应用程序table,但它也使用写时复制数据策略,并且它有自己的成本。大量更新会显着增加数据库的大小。当然,space 稍后会被重用。旧版 PageStore 后端在此类用例中表现更好,但它使用 table 级锁,并且不会并行执行来自不同会话的多个命令。 MVStore 和PageStore 都可以在需要的时候从磁盘读取数据,对于大型数据库不需要很大的内存。

HSQLDB默认在内存中保存所有内容,但它的存储格式更紧凑。它也不为索引使用额外的 space,因为 table 无论如何都会完全加载到内存中。当然,你不能那样使用非常大的table。 HSQLDB 也有普通的磁盘 tables,你可以用 CREATE CACHED TABLE 创建这样的 tables 并且这些 tables 以完全不同的格式存储并使用更多 space 在磁盘上比基于内存的 tables。但是,这样的 tables 仍然可以使用比 H2 中持久的 tables 更少的 space。

如果你想在 H2 中使用内存中的 tables,你需要用 CREATE MEMORY TABLE 创建它们,它们使用的磁盘内存量较小。默认情况下,H2 不会创建这种磁盘高效和内存低效的 tables。