我有一个代码评分表,很快就可以跨越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 |
+------------+----------+-------------+----------------+
每个questionid都有一些与之相关的点,当玩家正确解决问题时,他会获得积分并在代码评分表中输入一个条目,并将该条目的问题状态设置为已解决。如果玩家已经部分解决了问题,则总点数的某些部分将被授予玩家,并且在表格中输入一个条目,其中questionstatus设置为PENDING。
只要状态为PENDING,玩家就可以解决给定问题的任意次数,以提高他的分数。状态更改为SOLVED后,不再进行更新分数更新。虽然玩家仍被允许解决练习的问题。
现在问题的主要部分: 查找每个问题级别的前10名玩家(按降序排列)(简单,中等,硬)
使用以下查询查找HARD级别的前10名玩家:
SELECT playerid, SUM(playerscore) AS score FROM codescore
WHERE questionlevel = 'HARD'
GROUP BY playerid
ORDER BY score DESC
LIMIT 10;
如果表中的记录在生产环境中超过500K或1百万行,上述查询是否能正常工作? 是否有更好的解决方案可以解决此类问题或更好的查询以完成此任务?
[后端:使用MySQL和CodeIgniter]