MySQL InnoDB 大表 : to shard or to add more RAM?

标签 mysql innodb sharding

friend 们,我是一款社交游戏的开发者,游戏中已经有 70 万玩家,每天大约有 7000 名新玩家注册,大约有 5000 名玩家不断在线。

数据库服务器运行在一个非常强大的硬件上:16 核 CPU、24 Gb RAM、RAID-10 和 BBU 构建在 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。当然,这个表正在逐渐增长......我开始担心它会以负面方式影响数据库的整体性能。在不久的将来,我将不得不为此做点什么,但我不确定具体是什么。

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

最佳答案

如果您需要所有 300m 以上的行,则分片似乎是合理的。现在改变可能会很痛苦,但是当你的 table 越来越大时,会有一个点,再多的 ram 也无法解决你的问题。对于如此大量的数据,可能值得使用 couch db 之类的东西,因为您可以存储数据文档而不是行,即 1 个文档可以包含单个用户的所有记录。

关于MySQL InnoDB 大表 : to shard or to add more RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5424819/

相关文章:

PHP MySQL 搜索使用多个文本框搜索多列

mysql - 如何在数据库中保存标签(关键字)?

mysql - 启动 MySQL 时出现错误 "Plugin ' InnoDB 注册为存储引擎失败”

mysql - 有没有办法用 Doctrine Migrations 改变 MySQL 数据库引擎

mysql - 对dbShards有意见吗?

mongodb - 当集合之间存在关系时,mongodb 如何扩展?

php - 在同一查询中获取下一条和上一条记录

mysql - 来自 jenkins scriptler 的 groovy 脚本无法正常工作。类路径问题

mysql - 优化InnoDB数据库

php - 如何在php中实现多线程循环查询分表?