Я разработчик социальной игры, в которой у нас почти 2 миллиона игроков (и это число растет).
Главный сервер БД MySQL имеет 24 ГБ ОЗУ, и база данных может поместиться в память, если бы не одна таблица, которая имеет действительно большой размер.В настоящее время он имеет почти миллиард записей и его размер составляет 33 Гб.Он имеет следующую схему:
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_»
Разделите этот новый стол по хэшу
Найдите неактивных игроков, которые не играли в игру, скажем, в течение месяца.
Скопируйте свои записи из большой таблицы в архивную таблицу
Отметьте архивируемого игрока и используйте вместо него исходную таблицу архивов всякий раз, когда он /она регистрируется
При желании можно также разбить исходную таблицу по хешу (опционально, потому что это может вызвать большое время простоя)
Если ничего не помогаетподумай о шарде
Что ты думаешь об этом?Это похоже на хороший план?