我是一个社交游戏的开发者,我们有将近 200 万玩家(而且这个数字还在增长)。
主 MySQL DB 服务器有 24 Gb RAM,如果不是一个非常大的表,数据库可以放入内存中。目前它有近 10 亿条记录,其大小为 33Gb。它具有以下架构:
CREATE TABLE `plant` (
`player_id` int(10) unsigned NOT NULL DEFAULT '0',
`id` mediumint(8) unsigned NOT NULL DEFAULT '0',
`x` tinyint(3) unsigned NOT NULL DEFAULT '0',
`y` tinyint(3) unsigned NOT NULL DEFAULT '0',
`distort_step` tinyint(3) unsigned NOT NULL DEFAULT '0',
`grow_step` tinyint(3) unsigned NOT NULL DEFAULT '0',
`proto_id` int(10) unsigned DEFAULT '0',
`yflip` tinyint(4) NOT NULL DEFAULT '0',
`grow_start` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`player_id`,`id`)
) ENGINE=InnoDB
我正在考虑如何优化它的以下计划:
添加带有“archive_”前缀的类似表
通过哈希对这个新表进行分区
找出没有玩游戏的不活跃玩家,比如一个月。
将他们的记录从大表复制到存档表
标记正在存档的玩家并在他/她登录时使用存档表而不是原始表
也可以选择通过哈希对原始表进行分区(可选,因为它可能会导致大量停机)
如果没有什么有助于考虑分片
你怎么看待这件事?这听起来像是一个好计划吗?