我有一个有趣的数据库问题。 我有一个150GB的DB。 我的内存缓冲区是8GB。
我的大部分数据很less被检索,或主要被后端进程检索。 我非常希望把它们放在一边,因为有些function需要它们。
其中一些(即某些表格和某些表格的某些可识别部分)经常以面向用户的方式使用
我怎样才能确保后者总是被留在记忆中? (这里有足够的空间)
更多信息:我们正在轨道上的Ruby。 数据库是MYSQL,我们的表使用INNODB存储。 我们正在将数据分成两个分区。 因为我们正在分解它,所以我们使用JSON blob来存储大部分数据,而只索引主键
这里有很多select。 首先, NDB是MySQL的集群引擎,它将数据存储在内存中。 然而,NDB确实有一些限制 。
memcached是一个经常使用的stream行解决scheme,但它需要应用程序体系结构来支持它。
您可以将MyISAM表专门存储在RAM磁盘中,因为它们可以独立重新定位,与InnoDB不同。 InnoDB的整个表空间必须存储在RAM磁盘上。
但是,您可能会发现内存引擎比我的RAM磁盘更适合。 他们也比其他引擎更有限,因为他们不能支持BLOB等等。 对于要维护的数据,您将不得不有一个包装脚本来转储和恢复数据。 这也会给数据带来风险,即使使用脚本也会导致数据丢失。
最终,您可能会从正确调整和优化MySQL数据库和查询中获益最多。 正确调整MySQL数据库利用内存caching。
在Serverfault和Internet上已经有很多可用的资源。 MySQL有一个文档 ,这里有一个MySQL性能博客post ,这两个都是非常有用的资源。 这里有另一篇文章 ,他们有一个计算InnoDB内存使用率的公式。
你可以做的最好的是检查长时间运行的查询的执行计划,并适当调整1)查询和2)数据库。 您可以为“某些表的可识别部分”build立索引来加速查询。 您也可以将更频繁使用的数据移动到自己的表格中,并将不常用的数据移到它自己的表格中。
这样做与JSON斑点将是困难的,因为如果你需要访问JSON斑点的一个属性,你将不得不提取和parsing整个blob。 如果你的JSON blob格式是一致的,build立一个真实的表结构来反映这一点,你可能会1)已经提高了性能,2)当你需要稍后的性能调整时,结构更加灵活。