Нужна помощь с базой данных / дизайном запросов для расчета рейтинга игрока - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть игра, в которой за каждый раунд игрок получает приз и рассчитывается рейтинг по общему призу. Я использую такую ​​схему:

1) таблица game_result (user_id, приз, game_date) используется для отдельного хранения результатов игр (мне это нужно для статистики)

2) таблица рейтинга (user_id, total_prize, total_games) используется для хранения рейтинговых данных, а total_prize, значения total_games обновляются в конце каждой игры

3) Мне нужно быстро найти общий приз и позицию пользователя в рейтинге (чтобы отобразить его во время игры). Теперь я использую вид этого запроса

SET @rank=0;
SELECT @rank:=@rank+1 AS rank, user_id, total_prize, total_games FROM rating order by total_prize where user_id = ? 

, но он восстанавливает рейтинг таблицы для каждого запроса и работает слишком медленно. Проблема в том, что после каждой игры изменяется только одна строка (с total_prize, total_games) одного игрока, но чтобы найти его новое место для заказа, мне нужно пересмотреть всю таблицу, а производительность не достижима.

Можно ли реорганизовать таблицы для повышения производительности этой операции?

Спасибо!

1 Ответ

1 голос
/ 16 сентября 2011
SELECT COUNT(*)
FROM rating
WHERE total_prize <= (SELECT total_prize FROM rating WHERE user_id = ?)

(Или сделайте отдельный запрос и получите total_prize для пользователя, а также другие необходимые вам столбцы, а затем посчитайте его.)

Убедитесь, что конечно есть индекс total_prize.

(вместо этого вам может потребоваться> =, в зависимости от того, что вы подразумеваете под рангом.)

...