У меня есть таблица кодов, которая скоро пересечет 500 000 строк фиктивных данных. Стол используется для хранения очков, набранных игроками в игре. Ниже приведены столбцы, представленные в таблице.
questionid bigint,
playerid varchar(20),
playerscore float,
questionlevel enum('EASY', 'MODERATE', 'HARD'),
questionstatus enum('PENDING','SOLVED'),
lastmodified datetime,
created datetime
Primary key (questionid, playerid)
Пример данных:
+------------+----------+-------------+----------------+
| questionid | playerid | playerscore | questionstatus |
+------------+----------+-------------+----------------+
| 1 | 1 | 5 | PENDING |
+------------+----------+-------------+----------------+
| 1 | 2 | 10 | SOLVED |
+------------+----------+-------------+----------------+
| 3 | 1 | 10 | SOLVED |
+------------+----------+-------------+----------------+
| 2 | 3 | 10 | SOLVED |
+------------+----------+-------------+----------------+
Каждый вопрос имеет несколько баллов, связанных с ним, и когда игрок правильно решает задачу, ему присуждаются баллы, и запись вносится в таблицу кодовых баллов, а вопросительный статус для этой записи устанавливается на РЕШЕНО. Если игрок частично решил проблему, то некоторая часть от общего количества очков присуждается игроку, и в таблицу вносится запись с вопросом для состояния, установленным в ОЖИДАНИЕ.
Игрок может решить данную проблему любое количество раз, пока статус находится в состоянии ожидания, чтобы улучшить свой счет. После изменения статуса на «РЕШЕНО» обновление баллов больше не производится. Хотя игрок все еще может решить проблему для практики.
Теперь основная часть проблемы:
Найдите 10 лучших игроков (в порядке убывания) для каждого уровня вопроса (ЛЕГКО, УМЕРЕННО, ЖЕСТКО)
Используя следующий запрос, вы найдете 10 лучших игроков уровня HARD:
SELECT playerid, SUM(playerscore) AS score FROM codescore
WHERE questionlevel = 'HARD'
GROUP BY playerid
ORDER BY score DESC
LIMIT 10;
Будет ли приведенный выше запрос работать хорошо, если записи в таблице пересекают строки размером 500 000 или 1 миллион в производственной среде?
Есть ли лучшее решение для этого типа проблемы или лучший запрос, который можно использовать для выполнения этой задачи?
Задача ещё не решена.
Других решений пока нет …