登录 注册

【经验】批量数据查询实验

有关使用for循环单个查询获取数据、使用sql中in方式批量获取数据 在性能、耗时上的区别
时间:2016-07-16 11:08:31 作者:Mr.d

实验场景

1、数据库阿里云(单核、1G、1M带宽)自建mysql。

2、请求发起为本地。

3、数据库表trade_record_0中有300W数据,数据ID最小为3,最大为60000000。

4、随机生成0-6000000之间的数据,分别使用for循环单个获取,和使用sql语句中的in方法进行获取


可能出现的消耗

1、网络请求耗时

2、数据库QPS量

3、数据库IO读取速度


实验代码


                Map intMap = new HashMap();
		for (int i = 0; i<10000;) {
			int ran = (int) (Math.random()*6000000);
			if (intMap.get(ran) != null)
				continue;
			
			intMap.put(ran, 1);
			i++;
		}
			
		long startTime = System.currentTimeMillis();
		int index = 0;
		String sql = "select * from trade_record_0 where id = ?";
		for (int id : intMap.keySet()) {
			List list = Db.executeQuery(sql,newObject[]{id});
			if (CollectionUtils.isEmpty(list))
				continue;
			
			index ++;
		}
		
		System.out.println("program for get  ::: cost time:"+(System.currentTimeMillis()-startTime)+"  get :"+index);
		
		
		StringBuffer ids = new StringBuffer();
		for (int id : intMap.keySet()) {
			ids.append(id).append(",");
		}
		String idStr = ids.substring(0, ids.length() - 1);
		String sql1 = "select * from trade_record_0 where 1=? and id in ("+idStr+")";
		
		long startTime1 = System.currentTimeMillis();
		List list  = Db.executeQuery(sql1, new Object[]{1});
		System.out.println("sql in get  :::cost time:"+(System.currentTimeMillis()-startTime1)+"  get :"+list.size());



随机生成100个ID进行查询

第一次:

program for get  ::: cost time:4808  get :45

sql in get  :::cost time:41  get :45

第二次:

program for get  ::: cost time:4774  get :51

sql in get  :::cost time:38  get :51

第三次:

program for get  ::: cost time:4612  get :53

sql in get  :::cost time:45  get :53

第四次:

program for get  ::: cost time:4964  get :59

sql in get  :::cost time:202  get :59

第五次:

program for get  ::: cost time:3943  get :58

sql in get  :::cost time:77  get :58

随机生成1000个ID进行查询

第一次:

program for get  ::: cost time:47545  get :516

sql in get  :::cost time:209  get :516

第二次:

program for get  ::: cost time:36683  get :473

sql in get  :::cost time:202  get :473

第三次:

program for get  ::: cost time:36034  get :514

sql in get  :::cost time:407  get :514

第四次:

program for get  ::: cost time:34960  get :478

sql in get  :::cost time:298  get :478

第五次:

program for get  ::: cost time:32676  get :509

sql in get  :::cost time:167  get :509




随机生成10000个ID进行查询

第一次,也是唯一一次,一次查询耗时太长,没有耐心了,看看差别就知道了

program for get  ::: cost time:255325  get :4991

sql in get  :::cost time:1537  get :4991


结论

1、从实验的结果上来看,100条以内使用sql in批量和使用for单个查询去查询数据耗时长度相差了大概是100倍左右,1000条以内的耗时相差了100-200倍,而在10000条数据上,相差了多少,我也不知道了。

2、为何会出现这样的情况?举个例子:要你去拿一百个苹果,你是一次拿一个,跑一百次。还是一次拿完一百个再回来?

3、sql中关于in关键字的效率和性能问题,记得之前有人跟我说过,数据量小的情况下,in没什么影响,但是在数据量大的情况下会很很低效,我也不太清楚,但是我觉得这样的问题都是相对的,有的时候in会低效,但是有的时候为了满足某些需求,这种情况也是可取的。

4、还有个关键字叫做exist。


欢迎有兴趣的小伙伴跟我讨论,QQ:2410508062   或Q群:346884762





评论


暂无评论