MySQL学习笔记:普通查询、流式查询和游标查询的理解

前言

今天因为公司业务原因,使用了游标查询,只是感觉很奇怪,我以为MySQL和mongodb一样,默认就是游标查询,网上查询资料了解时还发现了流式查询
这篇,其实就是个人笔记,毕竟MySQL出来已经很久很久了,网上资料一大堆。
相比MySQL,我本人更擅长用mongodb,因为用了它三年。

普通查询

普通查询,将查询后的结果集,全部塞给客户端;

量大的话,就可能报OOM 内存溢出。

流式查询

流式查询获取数据的方法与普通查询其实是一样的( this.io.nextRow),不同之处在与普通查询时先获取所有数据,然后交给应用处理(next方法其实都是从内存数组遍历),而流式查询时逐条获取,待应用处理完再去拿下一条数据。

我个人理解:

流式查询的结果集一直存放服务端,并且客户端要一直和服务端保持连接,
等到客户端把这些结果集都消耗完了,才释放掉。

后来看到这篇文章,深入了解MySQL的流式查询机制时,算是肯定了想法,
并且还了解到,当前的数据库连接还不能公用;

如果使用了流式查询,一个MySQL数据库连接同一时间只能为一个ResultSet对象服务,并且如果该ResultSet对象没有关闭,势必会影响其他查询对数据库连接的使用!

游标查询

这种方式就和我了解的Mongodb类似,一次查询指定fetchSize的数据,直到把数据全部处理完。

但是游标查询也有缺点:

应用指定每次查询获取的条数fetchSize,MySQL服务器每次只查询指定条数的数据,因此单次查询相比与前面两种方式占用MySQL时间较短。但由于MySQL方不知道客户端什么时候将数据消费完,MySQL需要建立一个临时空间来存放每次查询出的数据,大数据量时MySQL服务器IOPS、磁盘占用都会飙升,而且需要与服务器进行更多次的网络通讯,因此最终查询效率是不如流式查询的。

mongodb用的时内存映射的方式来查询,但是量大的话,其实也有上述的问题。所以在写mongodb代码时,游标记得一定要及时关闭。

总结

一、普通查询

优点:应用代码简单,数据量较小时操作速度快。
缺点:数据量大时会出现OOM问题。
二、流式查询

优点:大数据量时不会有OOM问题。
缺点:占用数据库时间更长,导致网络拥塞的可能性较大。
三、游标查询

优点:大数据量时不会有OOM问题,相比流式查询对数据库单次占用时间较短。
缺点:相比流式查询,对服务端资源消耗更大,响应时间更长。

参考地址:
JDBC操作MySQL(3)—查询(普通、流式、游标)

深入了解MySQL的流式查询机制

你可能感兴趣的:(MySQL)