вы можете инкриментить счетчики у юзера например в таблице user_game_stat(тригерами или в бизнес логике когда становится известен результат)
структура например может быть такая (id, user_id, game_type, win_count, lost_count, total_games) - вы можете сюда добавить поле даты, чтобы у была инфа по стате юзера за какой то промежуток времени (например за сегодняшний день, или за вчерашний, или вообще периоды по 4 часа)
1. движение в каком виде? изменение позиции по отношению к прошлому дню? вообще за каждый день относительно всех ?
- в первом случае вам достаточно будет добавить поле с позицией за прошлый период и за текущий и агрегировать данные раз в N период
- во втором немного сложнее логика, но можно в user_game_stat хранить доп поле с рейтингом на момент времени, в итоге вы запросто сможете понять позиции любых игроков на момент времени в игре (можно запросто получить топ за любой промежуток в рамках минимального периода) и из этих же данных можете строить реальный топ на данный момент (т.е своеобразный агрегат, можете и конкретно по каждой игре, но когда будет большой нагруз в итоге уйдете в агрегаты по промежуткам)
* всё зависит от того что конкретно вам надо, возможно даже смесь обоих вариантов будет целесообразнее, зависит от задач
2. user_game_stat - хранит статистику по игре за промежутки(либо глобальную, смотря каким путем пойти) - можно юзать её, но в целом в профиле можно выводить стастику по конкретной игре на основе таблицы games(у вас ведь есть связь с юзерами и результат игры), либо же вам надо счетчики? тогда у вас есть таблица с ними по каждой игре
3. счетчики по игре?(проверять в момент изменения счетчика или раз во N времени?) можно агрегировать данные раз в час и смотреть, награды это вообще отдельная история :)
p.s возможно даже mysql не лучшее решение для вас, но вообщем для адекватной оценки мало информации о задаче, о нагрузке, но надеюсь в целом идея из написаного выше ясна ;) :)