排行榜排名的计数声明的成本?

时间:2014-05-02 14:15:37

标签: mysql sql database

我正在使用mysql进行游戏。我有一张约150,000条记录的分数表。该表看起来像:

fk_user_id | high_score

high_score列是一个int。它有一个索引。我想通过运行以下内容来确定用户的排名:

SELECT COUNT(*) AS count FROM scores WHERE high_score >= [x]

所以提供用户当前的high_score到上面,我可以得到他们的排名。我的想法是,每当用户查看个人资料页面时,我都会运行上面的内容来获得排名。

我想知道这是多么昂贵,如果我甚至走这条路。是否每次发出查询时mysql都会扫描整个表格?这是一个疯狂的想法吗?

更新:以下是关于查询的'解释'说明:

  

id:1

     

select_type:SIMPLE

     

表:分数

     

类型:范围

     

possible_keys:high_score

     

key:high_score

     

key_len:5

     

ref:null

     

行:1

     

额外:使用地点;使用索引

谢谢

2 个答案:

答案 0 :(得分:0)

如果high_score是索引,则成本相对较小(如果不是) - 然后进行全表扫描。

相对较小 - 只需从键中读取rowid并计算它们 - 成本非常低。

您始终可以编写explain后跟查询来检查数据库是否正在用于获取数据。

答案 1 :(得分:0)

MySQL正在扫描整个表格,查找您要求它返回的每条记录。

为什么使用count(*)无法使用count(distinct User_ID)count(user_ID)

您应该已将该列编入索引,并且我确信它会准确地返回您的结果。

SELECT COUNT(distinct user_ID) AS count FROM scores WHERE high_score >= [x]