有关如何加快此查询的任何想法?

时间:2015-03-23 15:41:11

标签: mysql performance query-optimization leaderboard

我有一个运行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

enter image description here

1 个答案:

答案 0 :(得分:3)

在你的桌子上有一个复合索引(appID,得分)

这样,where子句将直接跳转到你的AppID 60,然后转到得分13956,只得到更高的那些。由于您正在进行计数(*),因此无需返回原始数据页面即可获得资格。