我正在使用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
额外:使用地点;使用索引
谢谢
答案 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]