3

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

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

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

我如何确保后者始终被保存在内存中?(这些空间绰绰有余)

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

更新 2 棘手的是,数据实际上同时用于后端进程以及面向用户的功能。但后者的访问频率要低得多

更新 3 这些天有些人评论说 8Gb 是玩具。我同意,但是如果有更聪明、更有效的解决方案,仅仅增加数据库的大小就是纯粹的懒惰

4

5 回答 5

3

这就是我们有数据仓库的原因。将这两件事分成(a)单独的数据库或(b)一个数据库中的单独模式。

  1. 正在更新的最新数据,以便立即访问。

  2. 历史事实数据,用于分析,未更新。

150Gb 不是很大,单个数据库可以处理少量实时数据和大量历史记录。

使用“周期性”ETL 过程将内容从活动数据库中取出,非规范化为星型模式并加载到历史数据仓库中。

于 2010-05-20T17:36:14.453 回答
1

如果面向客户的表中使用的列数很少,您可以使用查询中使用的所有列创建索引。这并不意味着所有数据都保留在内存中,但它可以使查询更快。其响应时间的交易空间。

于 2010-05-20T17:47:44.360 回答
1

这需要 memcached!我推荐使用 cache-money,一个很棒的 ActiveRecord 直写缓存库。ngmoco 分支支持为每个模型启用缓存,因此您只能缓存那些您知道要保留在内存中的内容。

您还可以在控制器操作或模型挂钩中使用 $cache.set/get/expire 调用手动进行缓存。

于 2010-05-20T18:47:17.043 回答
0

那么,问题是什么?

首先,今天 150GB 不是很大。那是10年前的事了。

其次,任何非完全废话的数据库系统都会将您的内存用作缓存。如果缓存足够大(与正在使用的数据量相比),它将是有效的。如果没有,你唯一能做的就是获得更多内存(因为,抱歉,8gb 的内存对于现代服务器来说非常低 - 2 年前还低)。

您不必为有效使用内存做任何事情。至少不是在商业级数据库上——也许 mysql 很烂,但我不会假设这一点。

于 2010-05-20T17:39:52.303 回答
0

使用 MySQL,正确使用查询缓存会将频繁查询的数据保留在内存中。您可以使用 SQL_NO_CACHE 关键字提示 MySQL 不要缓存某些查询(例如来自后端进程)。

如果后端进程正在访问历史数据,或访问数据以进行报告,请务必遵循 S. Lott 的建议,创建一个单独的数据仓库并进行查询。如果数据仓库在短期内无法完成,您可以将事务数据库复制到不同的服务器并在那里执行查询(数据仓库为您提供了更多的灵活性和能力,所以如果可能的话,请走这条路)

更新:

更新 2:

我通过 MySQL 支持确认没有机制可以选择性地缓存 innodb 缓冲池中的某些表等。

于 2010-05-20T17:43:59.110 回答