Java修道之路:MySQL排名(优化)

之前有写到MySQL排名,见《Java修道之路:MySQL排名》,这篇文章中的sql语句写的很繁琐,分别嵌套了2个相同的子查询,也就是说运行这段sql会重复同样的查询2次,如果数据量很大,是很不合适的。当时我并不知道如何使用一个子查询完成工作,但是我隐约的感觉肯定可以只用一个子查询就能搞定…

这不,前几天正好有个同事写排名sql,我就看了下,果然不出所料,思路是完全一样,但同事就只使用了一个子查询就搞定了,细细读之,果然精炼,自己也试了下,又学到一个好东西,下面贴出sql,供参考也供留存:

连续重复排名:

-- 连续重复排名(精炼算法,只是用一个子查询)
select
	T.*,
	if (
		score = @LAST_SCORE,
		@LAST_ROW,
		@LAST_ROW := @LAST_ROW + 1
	) as RANK,
	@LAST_SCORE,
	@LAST_SCORE := score
from
	(select * from score order by score desc, id) as T,
	(select @LAST_ROW := 0, @LAST_SCORE := null) as RECORD

继续阅读

Java修道之路:Java实现排名

前一篇文章《Java修道之路:MySQL排名》写了如何用SQL来实现排名,这里想用java写一下排名算法,其实主要是想了解下两种方法的耗时,因为之前有同事说SQL的耗时会比Java少,所以想测试一下。

这里先说结果,我写的方法,测出来的结果,Java会比SQL快,也许是我的SQL写得并不优导致的,但是SQL一旦成形,就可以直接套用,使用比较方便,速度呢,1万条数据耗时相差无几,10万条数据(2个字段)耗时相差也就600毫秒左右。

继续阅读

Java修道之路:MySQL排名

mysql没有oracle那种排名函数,就只有自己实现,要么用sql,要么用java。

前几天研究了下sql的写法,贴出来,怕忘了可以瞄上一眼。

这里用到了mysql的自定义变量,写法如 @rank := 0,就是设置变量rank初始值为0。

为了测试sql,要有数据,用存储过程添加了1万条数据,花了大概13秒钟吧。

在公司测试的是10万条数据,花了110多秒钟吧,具体记不得了…

好了,下面开始贴代码:

1,随机生成1万条数据的sql,表只有两个字段:id和score,id自增,score随机0~100

-- 创建存储过程
drop procedure if exists proc;
create procedure proc() 
begin 
	declare i int;
	set i = 0;
	while i < 10000 do 
		insert into score values (null, format(rand() * 100, 0));
		set i = i + 1;
	end while;
end;

-- 执行存储过程
call proc();

继续阅读