自学内容网 自学内容网

在MySQL中遍历大数据集为什么推荐使用游标?

场景

从事开发的同学应该都知道,如果一个导出数据的需求总数据量在50w左右,没人会通过一条SQL直接查询出所有结果集并保存。因为这个操作会导致代码报出“内存溢出”的错误,通常会选择分页或者游标的方式实现这个需求。

原因

查询大结果集并导致代码报“内存溢出”的问题其实是由MySQL数据传输模式导致的

MySQL的数据传输模式是半双工的,在同一时间只有一端在执行发送数据。服务器只需要通过与客户端之间的连接一股脑将所有数据发送到客户端,这条连接就可以继续接收其他SQL指令。客户端接收到所有数据后,通常会将数据先保存到内存中。

数据库厂商都会提供一套自己的接口,通过这些接口外部应用程序就可以调用数据库软件的相关服务。接口只是一种定义,实现接口的代码称为驱动。
实现MySQL接口驱动的库函数会把服务器发送的数据保存到内存。

因此当一个查询会返回大量数据时客户端自然有可能会保存“内存溢出”的异常,分页的方式就是限制一次查询的结果集的大小,这个很容易理解。那游标是什么原理呢?
游标其实和分页的原理很像,只是有两个地方不一致。一是完整的数据在服务端二是每次查询只会返回一条数据当查询开启游标后,MySQL不再一次性发送所有数据到客户端,而是先把查询的结果集保存起来,当客户端通过游标获取数据时就从结果集中顺序返回一条数据,游标只能一直向前移动不能向后移动。直到遍历完所有结果集或者客户端主动结束游标查询。

当客户端通过一个连接启用游标查询后,这个连接会一直被游标查询占用,直到游标查询结束或客户端主动结束游标查询

扩展

配置文件中的max_allowed_packet
max_allowed_packet是控制服务器和客户端间通信时能传输的最大数据量,就是由于MySQL这种半双工数据传输模式才会有这个配置参数。这个参数的值过大或过小都不好,默认值是128M,具体可根据业务情况作合适的调整。值过大时有可能会占用过多的网络和内存资源,过小时会影响业务的查询功能


原文地址:https://blog.csdn.net/weixin_50849253/article/details/140273068

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!