今天看慢SQL日志,发现一个获取用户排名问题的日志如下:
SELECT rankNo FROM ( SELECT userId,( @rowNum := @rowNum + 1 ) AS rankNo
FROM
wf_member,(
SELECT
( @rowNum := 0 )) b
ORDER BY
studyTime DESC
) c
WHERE
userId = 123
该Rank函数方式耗时主要是对全表数据进行了排序,并且该字段没有索引,比较慢;
@@@使用变量的方式获取某字段排行,比较慢,然后我找到了几种优化方法;
1.查出比该字段大的数据数量+1即可:
SELECT
count(*) + 1
FROM
wf_member
WHERE
studyTime > ( SELECT studyTime FROM wf_member WHERE userId = 123)
直接从1.2s下降到了0.2s;
要注意的是,如果需要准确排名,例如排名的数据有相同值,则还是要用rank方式比较准确;