![数据库非常庞大,但其中很小一部分是实时检索的](https://linux22.com/image/514156/%E6%95%B0%E6%8D%AE%E5%BA%93%E9%9D%9E%E5%B8%B8%E5%BA%9E%E5%A4%A7%EF%BC%8C%E4%BD%86%E5%85%B6%E4%B8%AD%E5%BE%88%E5%B0%8F%E4%B8%80%E9%83%A8%E5%88%86%E6%98%AF%E5%AE%9E%E6%97%B6%E6%A3%80%E7%B4%A2%E7%9A%84.png)
我有一个有趣的数据库问题。我有一个大小为 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) 当您以后需要性能调整时拥有更灵活的结构。