非常大的数据库,非常小的部分,实时检索

时间:2010-05-20 17:30:49

标签: database performance database-design memory database-administration

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

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

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

如何确保后者始终保存在内存中? (这些空间足够多)

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

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

更新3 这些天有些人评论比8Gb玩具。我同意,但如果有一个更智能,更有效的解决方案,只是增加db的大小就是纯粹的LAZINESS

5 个答案:

答案 0 :(得分:3)

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

  1. 当前,即时访问,正在更新的数据。

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

  3. 150Gb不是很大,一个数据库可以处理你的一些实时数据和你的大量历史。

    使用“定期”ETL过程将事物从活动数据库中取出,将其归一化为星型模式并加载到历史数据仓库中。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

那么,问题是什么?

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

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

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

答案 4 :(得分:0)

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

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

更新:

更新2:

我向MySQL支持证实,没有机制可以选择性地缓存innodb缓冲池中的某些表等。