那么,这个“结果集”存在哪里呢?
服务端无需保存一个完整结果集。取数据和发数据的流程是这样的:
-
获取一行,写到net_buffer。这块内存的大小是由参数net_buffer_length定义,默认16k
-
重复获取行,直到net_buffer写满,调用网络接口发出去
-
若发送成功,就清空net_buffer,然后继续取下一行,并写入net_buffer
-
若发送函数返回EAGAIN或WSAEWOULDBLOCK,就表示本地网络栈(socket send buffer)写满了,进入等待。直到网络栈重新可写,再继续发送
- 查询结果发送流程
可见:
-
一个查询在发送过程中,占用的MySQL内部的内存最大就是net_buffer_length这么大,不会达到200G
-
socket send buffer 也不可能达到200G(默认定义/proc/sys/net/core/wmem_default),若socket send buffer被写满,就会暂停读数据的流程
所以My