场景:
好奇心驱使的探索,实验结果可能并不严谨
控制变量法:同样MySQL5.7环境下,手写分组连续排名函数,第一组使用case when,第二组使用if,对14万数据排名,查看效率,代码如下。
代码部分
排名函数(CASE WHEN 方式):
SELECT
CASE
WHEN @pre_name = t.name THEN
@cur_rank := @cur_rank + 1
ELSE
@cur_rank := 1
END AS rank,
@pre_name := t.name AS studentName,
t.create_time
FROM
student_score t,
(SELECT @pre_name := NULL, @cur_rank := 0) r
ORDER studentNameY t.name ASC, t.create_time DESC
排名函数(IF 方式):
SELECT
IF(@pre_name = t.name, @cur_rank := @cur_rank + 1, @cur_rank := 1) AS rank,
@pre_name := t.name AS studentName,
t.create_time
FROM
student_score t,
(SELECT @pre_name := NULL, @cur_rank := 0) r
ORDER studentNameY t.name ASC, t.create_time DESC
查询速度:
case when方式,执行速度稳定在0.27s-0.29s之间。如图:
if方式,执行速度稳定在0.42s-0.48s之间。如图:
总结:
数据量较大情况下,CASE WHEN 的效率更高,IF效率略低一些
。
0.2s的性能提升可能不是很大,但聚少成多就能给用户更好的体验。