Mysql 有没有关于如何加快查询速度的想法?

Mysql 有没有关于如何加快查询速度的想法?,mysql,performance,query-optimization,leaderboard,Mysql,Performance,Query Optimization,Leaderboard,我有一个使用mysql的排行榜,我所有的游戏都连接到它。类似的查询每天被调用数百万次。唯一改变的是用户的分数和appID,这取决于游戏。此查询从用户正在玩的应用程序中提取用户排名。我已经有了分数和appID的索引 SELECT count(*) FROM users_scores WHERE score > 13956 AND appID='60' 这是一个相当基本的查询,所以我不确定在查询本身的方式中是否有很多可以做的事情。该表本身有大约220万条记录,并且每天都在增长。我想知道是否应

我有一个使用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;;
下面是对上述查询的解释


在表上有一个复合索引(appID,score)


这样,where子句将直接跳转到您的AppID 60,然后跳转到13956分,只得到那些更高的分数。由于您正在进行计数(*),因此不必返回原始数据页进行验证。

您需要向我们显示表和索引定义,以及每个表的行计数。也许您的表定义不好。可能索引没有正确创建。也许你在你认为你有的专栏上没有索引。如果看不到表和索引定义,我们无法判断。我们需要行计数,因为这会影响查询规划。如果你知道如何进行
解释
或获得执行计划,也可以将结果放在问题中。记分卡更新了多少次?如果更新频率小于显示排行榜的频率,您可能会考虑存储与用户对应的排名,并在每次得分时更新排名changes@AndyLester好的,我上传了表格结构并在query@vishva分数表会一直更新。每当用户查看排行榜时,他们都会提交分数,并更新表格。话虽如此,我有一个cron运行,将前30名分数缓存到一个json文件中,当用户加载排行榜时,他们将看到缓存的json文件,而不是表的实时查询。每次他们的排名变化都会更新排名,这对数据库来说太麻烦了。是的,直到我发布了表格结构,我才意识到这一点。最好的办法是什么,删除索引并使用主键?@Dave,主键,我会根据唯一ID保持原样。我只会将第二个索引创建为两列,但将AppID保持在第一个位置,将score保持在第二个位置。好的,我在第一篇文章中编辑了这个表,现在看起来怎么样?@Dave,看起来不错。。。在本例中,它既是一个复合索引,又是一个覆盖索引,以防您想要研究这些术语:)
device\u id
是一个UUID吗?如果是,则
主键
会吸吮。我是。uuid是非常随机的。这会影响插入和选择。当表变得比缓冲池中可以缓存的数据还大时,这将是一场灾难。