2garin поднял довольно актуальную тему. Но сам я думал о несколько ином варианте такой "чистки" старых персов: не удалять, а отправлять в архив.
Т.е. выделить дополнительную архивную БД (типа "characters_archive") и перенести туда все записи, относящиеся к персонажам, которыми не играли более года, двух, трёх и т.д. При этом освободив ресурсы, которые занимали эти персонажи (guid, name, etc...).
Правда, тут придётся проявить некую программерскую изобретательность, чтобы каскадно удалить все линки на этих чаров (на guid-ы чаров). Например, все ссылки на архивированного перса с крафтовых предметов (чтобы не указывался в качестве изготовителя персонаж, который потом займёт guid архивированного, возможно вообще удалять строчку с изготовителем), все ссылки из списка друзей, гильдии (если чар - не глава гильдии, а если глава гильдии, то удалить всех из гильдии и гильдию тоже в архив вместе с чаром).
Тогда дополнительно к этому придётся ещё модифицировать ЛК, где в спец. разделе (например, "архив персонажей") можно будет просмотреть, каких чаров туда закатала архивирующая машина (не вручную же это делать). А чаров пусть потом за бонусы восстанавливают. А после восстановления, разумеется, смена ника (возможно, расы, фракции, либо это всё будет в стоимости восстановления чара) и присвоение новых guid-ов персонажам.
Такая система автоматического архивирования персонажей позволит облегчить основную ("рабочую") БД, к которой в реальном времени идут запросы.
Также можно было бы архивировать не только персонажей (с их инвентарями и гильдиями), но также и акаунты. Например, в БД "auth_archive", соответственно, с высвобождением account.id и account.username. Но в таком случае задача усложнится, т.к. нужно будет делать отдельный ЛК для архивированных аккаунтов (например, cparch.wowcircle.com) и предусмотреть возможность того, чтобы вернувшиеся игроки могли ввести свой старый username и password (sha_pass_hash не меняется). Но это, если хочется изысканных программных извращэний...
А как критерий для архивирования можно было бы ввести дополнительную переменную на персонажа (или на аккаунт в целом), которая бы имела прямую зависимость от частоты посещений, количества достижений, игрового времени, потраченых на персонажа бонусов, и обратную зависимость от времени с момента последнего посещения, например:
Код:
Oc = (a*(O/T) + b*A + c*Pt + d*B) / T, где
Oc (Online coefficient) - онлайн коэффициент
a*(O/T) - частота посещаемости, где
a - калибровочный коэффициент (по умолчанию = 1)
O - количество дней, когда игрок входил в игру
T - период существования персонажа/аккаунта (с момента создания/регистрации)
b*A - достижения персонажа (суммарное кол-во ачив всех персонажей аккаунта), где
b - калибровочный коэффициент
A - достижения (возможно, просто ачивпойнты)
c*Pt - игровое время данным персонажем (суммарное игровое время всех персонажей аккаунта), где
c - калибровочный коэффициент
Pt - непосредственно игровое время в днях/часах/минутах (одним числом)
d*B - бонусозатраты на персонажа (всех персонажей аккаунта), где
d - калибровочный коэффициент
B - непосредственно количество бонусов
T - период (см. выше)
Либо можно упростить формулу, объединив частоту посещений и игровое время:
Код:
Oc = (a*(Pt/T) + b*A + d*B) / T
Калибровочные коэффициенты - для настройки важности того или иного аргумента для результирующего значения функции Oc. Если результат функции Oc не превышает какого-либо значения (а он будет снижаться с течением времени), то закатать в архив...
Вычисление "онлайн коэффициента" можно производить раз в сутки (перед перезагрузкой), а архивирование сразу после перезагрузки (пока сервер ещё не загрузился).
Вероятность того, что кто-то после двух лет не-игры опять вернётся не очень высока, но рабочая БД при этом будет содержать только актуальных персонажей.