数据库操作有多慢
“数据库操作很慢”,“尽量避免数据库操作”这些话已经早已深入我心,但可笑的是从未实验过。现在恰巧哟这么个机会,简单的实验一下吧。
现在有一张表,有25字段,只有ID有索引(主键),该表存储了20488条数据,导出的sql有11.1M。
项目中的是struts2+spring+ibatis,赖的费事,就直接在service中以并发1的情况下比较了一下速度(耗时)。
实验1
查询1:利用"where 1 = 1 and P_ID=? "去查询(其中P_ID没有索引)
测试结果:直接查询数据库用时47ms(32,699,268ns),获取数据89条。
查询2:
a.首先把2万条数据都查出来放到ArrayList中(不计算在时间内)
b.for循环ArrayList并对比P_ID
测试结果:FOR循环 20488条数据用时0ms(7,086,888ns),获取数据89条。(呵呵,(System.currentTimeMillis() - start)已经满足不了我们的需求了)
实验1结果:
此种情况下查询2比查询1快了(32,699,268/7,086,888)=4.6倍。
实验2
查询1:利用"where 1 = 1 and ID=? "去查询(其中ID是主键)
查询1测试结果:直接查询数据库用时11,589,130ns,获取数据1条。
查询2:仍旧采用遍历ArrayList,对比ID方式
查询2测试结果:for循环 20,488条数据用时2,456,200ns,获取数据1条。
实验2结果:
此种情况下查询2比查询1快了( 11,589,130 / 2,456,200)=4.7倍。
结论:
1.for循环方式比直接查找数据库快了4.5倍以上,与是否有主键差别不大。
疑问:
1.“查询2测试结果”和“查询2测试结果”同时:for循环 20488次,但耗时尽然差了(7086888/2456200)=2.8853057568601908倍,很是不解。即使去除for中间的tempList.add(o);也是如此。
很奇怪啊if (o.getID().equals(pid))明显快于if (o.getP_ID().equals(pid))。
上一篇: 字符串去重的一个实例分享
下一篇: oracle-需要学习的sql语句-1