在日常开发中,常因为分页查询的使用,或者SQL的语法问题导致的全表扫描,这带来的问题可能会有系统的OOM,频繁的GC,以及慢SQL,数据返回慢等问题。那么我们如果光从内存这个角度看这个全表扫描的问题,他是怎么样进行查询返回结果的呢?
假设我的主机内存就几个G,但是全表的数据可能是它的几倍,那么机器的内存会直接用光吗?
结合日常的开发工作,对大表做全表扫描,看来应该是没问题的(只看数据而言)。但是,这个流程到底是怎么样的呢?
一个查询语句的状态变化
MySQL查询语句进入执行阶段后,首先把状态设置成“Sending data”;
然后,发送执行结果的列相关的信息(meta data) 给客户端;
再继续执行语句的流程;
执行完成后,把状态设置成空字符串。
仅当一个线程处于“等待客户端接收结果”的状态,才会显示"Sending to client";而如果显示成“Sending data”,它的意思只是“正在执行”。
net_buffer_length
这部分用来存放客户端连接线程的连接信息和返回客户端的结果集。当 MySQL 开始产生可以返回的结果集,会在通过网络返回给客户端请求线程之前,会先暂存在通过 net_buffer_length 所设置的缓冲区中,等满足一定大小的时候才开始向客户端发送,以提高网络传输效率。不过,net_buffer_length 参数所设置的仅仅只是该缓存区的初始化大小,MySQL 会根据实际需要自行申请更多的内存以满足需求,但最大不会超过 max_al