@miki131

Как сделать статистику?

Есть такая таблица
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


При разработке все было нормально, но на большом к-ве строк в таблице запрос выполняется слишком долго.

Какие еще есть варианты реализации моей задачи?
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 1
@entermix
Собирайте статистику в отдельную таблицу, например каждый день, и делайте там обычный select.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы