Есть такая таблица
CREATE TABLE `top_stats` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`user_id` int(10) unsigned NOT NULL,
`points` int(10) unsigned NOT NULL,
`win` tinyint(4) NOT NULL,
PRIMARY KEY (`id`),
KEY `top_stats_time_index` (`time`),
KEY `top_stats_user_id_index` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
После каждой игры, в которой принимают участия несколько пользователей, я записываю в таблицу данные.
INSERT INTO `top_stats` (`time`, `user_id`, `points`, `win`)
VALUES
(NOW(), UID, POINTS, WIN_OR_LOSE);
Строк получается столько же сколько игроков было в игре
UID - ид пользователя
POINTS - сколько поинтов получил игрок за игру
WIN_OR_LOSE - если выиграл - 1. иначе - 0
Дальше мне надо вывести статистику за последний день\неделю\месяц.
Я беру статистику вот так
select *, COUNT(id) as games_count, SUM(win) as wins_count, SUM(points) as wins_points
from top_stats FORCE INDEX (top_stats_time_index)
where `time` > DATE_SUB(NOW(), INTERVAL 1 DAY)
group by `user_id`
order by `wins_points` desc
limit 50
При разработке все было нормально, но на большом к-ве строк в таблице запрос выполняется слишком долго.
Какие еще есть варианты реализации моей задачи?