H2 性能建议

Posted

技术标签:

【中文标题】H2 性能建议【英文标题】:H2 performance recommendations 【发布时间】:2015-06-05 07:39:39 【问题描述】:

我目前正在使用一个更大的数据库,虽然我没有具体问题,但如果有人有任何建议,我希望得到一些建议。

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

我目前使用的数据库网址是:

jdbc:h2:D:/data;AUTO_SERVER=true;MVCC=true;CACHE_SIZE=524288

它在我们的 Java VM 中运行,该 VM 具有 4GB 最大堆。

我想知道的一些事情:

在单独的进程中运行 H2 是否会对性能产生任何影响(无论好坏)? 将 blob 放在与元数据 1-1 关系的单独表中是否有帮助?我可以想象它会有助于缓存,而不是让 blob 挡道? 互联网上似乎存在分歧,是在数据库中包含 blob,还是将它们写入文件系统上的文件,并在数据库中提供链接。这里有任何针对 H2 的建议吗?

【问题讨论】:

【参考方案1】:

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

回答您关于 H2 的问题:

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

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

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

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

【讨论】:

以上是关于H2 性能建议的主要内容,如果未能解决你的问题,请参考以下文章

H2数据库删除查询需要很长时间

[性能测试]性能测试建议

微软typescript性能建议

前端性能优化 23 条建议

Linux 网络性能的 15 个优化建议!

高性能 建议 实践