我有一个运行mysql的排行榜,我的所有游戏都连接到它。类似于此的查询每天被调用数百万次。唯一改变的是用户得分和appID,具体取决于游戏。此查询从用户正在播放的应用中提取用户排名。我已经有得分和appID的索引。
SELECT count(*) FROM users_scores WHERE score > 13956 AND appID='60'
这是一个相当基本的查询,因此我不确定是否可以通过查询本身的方式完成很多工作。该表本身有大约220万条记录,并且每天都在增长。我想知道在列表中添加一个名为rank的列是否明智,然后每隔5分钟左右让cron更新所有等级。更新所有级别时服务器将处于高负荷状态,但是每秒运行该查询90次以上会更好吗?
或者你可能有另一个想法,我没想到?
编辑这是表格设置
CREATE TABLE IF NOT EXISTS `users_scores` (
`deviceID` varchar(36) NOT NULL,
`appID` int(3) NOT NULL,
`score` bigint(20) NOT NULL,
`username` varchar(20) NOT NULL,
`avatar` int(3) NOT NULL,
`userData` text NOT NULL,
PRIMARY KEY (`deviceID`,`appID`),
KEY `user_score` (`appID`,`score`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;;
以下是上述查询的EXPLAIN
答案 0 :(得分:3)
在你的桌子上有一个复合索引(appID,得分)
这样,where子句将直接跳转到你的AppID 60,然后转到得分13956,只得到更高的那些。由于您正在进行计数(*),因此无需返回原始数据页面即可获得资格。