server层
MySQL是“边读边发的”,这个概念很重要。这就意味着,如果客户端接收得慢,会导致MySQL服务端由于结果发不出去,这个事务的执行时间变长。server层可以理解分为两个阶段,查询数据阶段和发送数据阶段。
MySQL查询语句进入执行阶段后,首先把状态设置成“Sendingdata”;发送执行结果的列相关的信息(metadata)给客户端,把状态设置成“Sendingtoclient”;继续执行查询语句的流程;执行完成后,把状态设置成空字符串。
Sendingdata
表示执行过程中,大致可以理解为在存储引擎中执行。如innodb而言,WAL机制既可以处理数据写入速度,也可以加速查询,因为根据innodb_buffer_pool_size配置,会把磁盘的数据缓存到bufferpool中。
Sendingtoclient
1.获取一行,写到net_buffer中。这块内存的大小是由参数net_buffer_length定义的,默认是16k。2.重复获取行,直到net_buffer写满,调用网络接口发出去。3.如果发送成功,就清空net_buffer,然后继续取下一行,并写入net_buffer。4.如果发送函数返回EAGAIN或WSAEWOULDBLOCK,就表示本地网络栈(socketsendbuffer)写满了,进入等待。直到网络栈重新可写,再继续发送。
MySQL采用的是边算边发的逻辑,因此对于数据量很大的查询结果来说,不会在server端保存完整的结果集
相关阅读:「看这篇就够了」Mysql事务提交是怎么在保证性能情况下持久化?
「看这篇就够了」Mysql的limit有哪些优点,快来了解下吧
「看这篇就够了」Mysql幻读的原理介绍