数据库非常庞大,但其中很小一部分是实时检索的

数据库非常庞大,但其中很小一部分是实时检索的

我有一个有趣的数据库问题。我有一个大小为 150GB 的数据库。我的内存缓冲区是 8GB。

我的大部分数据很少被检索,或者主要由后端进程检索。我非常希望保留它们,因为某些功能需要它们。

其中一些(即某些表格,以及某些表格的某些可识别部分)经常以面向用户的方式使用

我如何确保后者始终保存在内存中?(有足够的空间容纳这些)

更多信息: 我们使用的是 Ruby on Rails。数据库是 MYSQL,我们的表使用 INNODB 存储。我们将数据分片到 2 个分区。因为我们要分片,所以我们使用 JSON blob 存储大部分数据,同时只索引主键

答案1

这里有很多选择。首先,新开发银行是 MySQL 的集群引擎,它将数据存储在内存中。NDB 确实有一些局限性, 然而。

memcached是一种经常使用的流行解决方案,但它需要应用程序架构来支持。

您可以将 MyISAM 表专门存储在 RAM 磁盘中,因为它们可以单独重新定位,这一点与 InnoDB 不同。InnoDB 的整个表空间必须存储在 RAM 磁盘上。

您可能会发现内存引擎不过,它比我的 RAM 磁盘破解更适合。它们也比其他引擎更受限制,因为它们不支持 BLOB 等。为了维护数据,您必须有一个包装器脚本来转储和恢复数据。这也给数据带来了风险,因为即使使用脚本,断电也会导致数据丢失。

最终,您很可能从正确调整和优化 MySQL 数据库和查询中获益最多。正确调整的 MySQL 数据库会利用内存缓存。

Serverfault 和整个互联网上都有很多关于此问题的资源。MySQL 有一个文档这是MySQL 性能博客文章,都是非常有用的资源。以下是另一篇帖子他们有一个计算 InnoDB 内存使用量的公式。

答案2

您能做的最好的事情可能是检查长时间运行的查询的执行计划,并适当调整 1) 查询和 2) 数据库。您可以为“某些表的可识别部分”构建索引以加快查询速度。您还可以将更频繁使用的数据移到其自己的表中,将不经常使用的数据移到其自己的表中。

使用 JSON blob 执行此操作会很困难,因为如果您需要访问 JSON blob 的一个属性,则必须获取并解析整个 blob。如果您的 JSON blob 格式一致,请构建一个真实的表结构来反映这一点,并且您可能 1) 已经提高了性能,并且 2) 当您以后需要性能调整时拥有更灵活的结构。

相关内容