MySQL InnoDB大表:要分片还是要添加更多内存?

时间:2011-03-24 20:00:49

标签: mysql innodb sharding

伙计们,我是社交游戏的开发者,游戏中已经有70万玩家,每天大约有7k新玩家注册,大约有5k玩家在线。

数据库服务器运行在功能非常强大的硬件上:16核CPU,24 Gb RAM,带有BBU的RAID-10,内置4个SAS磁盘。我正在使用Percona服务器(修补MySQL-5.1),目前InnoDB缓冲池是18Gb(尽管根据innotop只有几个可用的缓冲区)。数据库服务器运行良好(2k QPS,iostat%util为10-15%,在vmstat中“b”状态几乎总是0个进程,loadavg为5-6)。然而,有时(每隔几分钟)我会得到大约10-100个慢查询(每个查询可能持续约5-6秒)。

MySQL数据库中有一个大的InnoDB表占用了最多的空间。它有大约3亿行,它的大小约为20 Gb。当然,这个表正在逐渐增长......我开始担心它会以负面的方式影响数据库的整体性能。在不久的将来,我将不得不做些什么,但我不确定到底是什么。

基本上问题归结为是否要分片或只是添加更多内存。当然,后者更简单。看起来我可以添加高达256 Gb RAM。但问题是我是否应该投入更多时间实施分片,因为它更具可扩展性?

3 个答案:

答案 0 :(得分:1)

如果您需要拥有所有300米以上的行,则分片看似合理。现在改变可能是一种痛苦,但是当你的桌子长大和成长时,没有多少ram可以解决你的问题。有了如此大量的数据,可能值得使用像沙发数据库这样的东西,因为你可以存储数据文件而不是行,即1个文档可以包含单个用户的所有记录。

答案 1 :(得分:0)

听起来像你的主数据库表可以使用一些规范化。您的所有信息都属于那一个表,还是可以将其拆分为较小的表?规范化现在可能会引发一个小的性能损失,但随着表的增长,访问巨大的整体表所涉及的额外处理将使这种情况不堪重负。

答案 2 :(得分:0)

I'm getting about 10-100 slow queries(where each may last about 5-6 seconds).

评论引用:Database is properly normalized. The database has many tables, one of them is really huge and has nothing to do with normalization. 当我读这篇文章时,我会说它与你的查询有关..与你的硬件无关。普通公司会梦想你拥有的那种服务器!

如果你写错了查询,那么表的规范化程度并不重要,那就慢了。 也许你有一些关于this的东西,它几乎是一个类似的答案问题(数据库很慢,类似的东西)。

还想过存档一些东西?例如,从ID 1开始的3亿,那ID仍然被使用?如果不是为什么不将它存档到其他数据库或表(我建议数据库)。我也相信并非每个70万用户每天都会登录(如果你受到尊重!但我不相信)。

您还说'此表包含玩家特定项目'具体哪些项目?

另一个问题,您可以发布一些“慢”查询吗?

您还考虑过某些数据的缓存系统?也许每月更换一次,就像装备其他游戏一样?