MySQL设置了useCursorFetch,FetchSize参数的影响

15 篇文章 0 订阅

从MySQL中获取一定量的数据出来,如果不设置 useCursorFetch,mysql会把所有的数据从数据库端搬到客户端后再做处理,这样我们原先使用ResultHandler的方式节省内存的打算就落空了。

还好MySQL在连接串上,使用了useCursorFetch=true,就可以达到将部分数据搬到客户端就进行处理,那么这时 FetchSize 对系统会产生什么影响;

以下FetchSize设置成 Integer.MIN_VALUE 和 一个常量,来进行比较 (如果不设置FetchSize,和不使用useCursorFetch参数效果一样):

  • 获取总数据量: 55.6w条
  • ResultHandler中,使用空方法;
FetchSize值内存消耗-通过JVisualVM观测第一次获取全部数据用时第二次获取全部数据用时
Integer.MIN_VALUE几乎看不到byte[]消耗的内存10.093s10.12s
10000

byte[]占用内存,仅次于char[]

每次变化,差不多在10M上下(这个和每条记录的大小有关)

21.892s22.376s
500 28.81s28.188s
1 

时间太长了,还以为死了,加了一个断点看还活着

吃好饭回来看,竟然用了2438.094s,

 

如果把FetchSize=Integer.MIN_VALUE,当成每次取一条,那么耗时应该比 FetchSize=10000 时间长,因为每一条都要和数据库交互一次,但实测结果,竟然只有 FetchSize=10000 的一半时间;

后来又用FetchSize=500又试了一次,全部获取到时间,比10000条的设置时间要长,那看来FetchSize=Integer.MIN_VALUE不能认为是FetchSize=1,确实只能认为是文档上的 stream 方式;

后来确确实实用FetchSize=1做了一次,等了好久不出结果,吃饭回来一看,竟然用了40分钟,看来还是用 FetchSize=Integer.MIN_VALUE效率最高;

 

 

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值