Я пытаюсь сохранить пользовательскую статистику в базе данных, которая будет отображаться в таблице лидеров, которая может быть отсортирована по различным категориям (например, top XP, top kills и т. Д.), А также фильтрация по времени (ежедневная, еженедельная, ежемесячная и общая статистика).
В настоящее время у меня есть таблица опыта в моей базе данных, которая вставляется в каждый раз, когда пользователь зарабатывает какой-либо xp, сохраняя идентификатор пользователя, значение xp и метку времени, когда он был задан. У меня также есть таблица убийств, в которой хранятся все убийства, которые есть у пользователя, с отметкой времени и другими данными, которые нужны в другом месте.
Текущий размер моей таблицы опыта составляет ~ 1,4 миллиона строк, а таблицы убийств — ~ 4,1 миллиона строк. Иногда подсчет пользовательских убийств за месяц может занять около 1 секунды (с помощью MySQL count (), чтобы получить общую сумму за указанный период).
Текущий способ получения общей XP и упорядочения ее по значению:
SELECT DISTINCT `user_id`, SUM(`value`) AS `total`
FROM `user_experience`
WHERE `timestamp` > ?
GROUP BY `user_id`
ORDER BY `total` DESC
LIMIT 20 offset 0
Есть ли лучший способ получить общее количество очков опыта или более быстрый способ получить общее количество убийств, которые пользователь заработал за выбранное время и упорядочить по значению? Есть ли лучший способ сохранить журнал xp / kill и по-прежнему иметь возможность искать его по времени?
Задача ещё не решена.
Других решений пока нет …