H2性能建议

Bre*_*man 5 java database h2

我目前正在使用一个更大的数据库,虽然我没有具体问题,但我想要一些建议,如果有人有的话.

该数据库为2.2千兆字节(重建/压缩后).它包含大约50个表.其中一个表包含blob和一些元数据.它目前有大约22000行.如果我从表中删除blob(UPDATE表SET blob = null),数据库大小将减少到大约200兆字节(重新创建/压缩后).元数据被大量访问,然而blob并不经常需要.

我目前使用的数据库URL是:

jdbc:h2:D:/data;AUTO_SERVER=true;MVCC=true;CACHE_SIZE=524288
Run Code Online (Sandbox Code Playgroud)

它运行在我们的Java VM中,最大堆容量为4GB.

我想知道一些事情:

  • 在单独的流程中运行H2会对性能产生任何影响(无论好坏)?
  • 将blob放在与元数据具有1-1关系的单独表中会有帮助吗?我可以想象它会有助于缓存,而不是让blob在路上?
  • 互联网似乎对是否在数据库中包含blob或将其写入文件系统中的文件以及DB中的链接存在分歧.有什么特定H2的建议吗?

小智 2

答案取决于 Blob 数据的增长率。例如,如果您的数据集每周增长 10%,那么尝试扩展 H2 的使用来存储 blob 数据就没有什么意义了(因为它将很快超过可用堆内存的速度)。相反,如果 blob 数据是最大的,那么尝试使用 H2可能是有意义的。

回答您有关 H2 的问题:

1) 在单独的进程中运行 H2 将允许 H2 占用大部分堆空间 - 使得控制 H2 的可用堆空间更加易于管理。但是,您还会增加维护和监视单独流程的维护开销。所以答案是“这取决于你的运营环境和目标”。如果您有人力和时间,在单独的进程中运行 H2 可能是有意义的。但如果这是真的 - 那么您可能应该考虑只运行适当的 blob 存储平台。

2)是的,您是正确的,将 blob 存储在单独的表中将有助于缓存 - 在您不经常需要 blob 的情况下。它还应该有助于缩短检索时间,因为 H2 不必读取 blob 来查找元数据。

3) 请注意,“互联网”代表了成千上万的人,他们拥有几乎同样多的不同特定用例。您需要将用例过滤为需求,然后应用从其他人那里收集到的逻辑。

4)我个人的建议是,如果您想创建一个可扩展且可维护的平台 - 使用正确的工具。H2 或任何其他关系数据库通常不是存储许多大型 blob 的正确工具。我建议您使用键/值存储进行调查。