MySQL 客户端/服务器端通信协议

MySQL 客户端/服务器端通信协议


    mysql客户端和服务器的通信协议是半双工的,这意味着在任何时刻,要么由服务器向客户端发送数据,要么由客户端向服务器发送数据,这两个动作不能同时发生。所以我们无法也无须将一个消息切成小块独立来发送。

    这种协议让mysql通信简单快速,但也从很多地方限制了mysql。一个明显的限制是没法进行流量控制。一旦一端开始发送消息,另一端要接收完整个消息才能响应它。

    客户端用一个单独的数据包将查询传给服务器。一旦客户端发送了请求,他能做的事情就只是等待结果了。

    相反的,一般服务器响应给用户的数据通常很多,由多个数据包组成。当服务器开始响应客户端请求时,客户端必须完整的接收整个返回结果,而不能简单的只取前面几条结果,或者接收完几条结果后就粗暴地断开连接。这也是在必要的时候一定要在查询中加上limit限制的原因。


    多数连接mysql 的库函数都可以获得全部结果集并缓存到内存中,还可以逐行获取需要的数据,默认一般是获取全部结果集并缓存到内存中mysql通常要等待所有的数据都已经发送给客户端才能释放这条查询所占用的资源,所以接收全部结果并缓存通常可以减少服务器的压力,让查询能够早点结束,早点释放相应的资源。


    当使用多数连接mysql的库函数从mysql获取数据时,其结果看起来都像是从mysql服务器获取数据,而实际上都是从这个库函数的缓存获取数据。多数情况下这没什么问题,但是如果需要返回一个很大的结果集的时候,这样做并不好,因为库函数会花很多时间和内存来存储所有的结果集。如果能够尽早开始处理这些结果集,就能大大减少内存的消耗,这种情况下可以不使用缓存来记录结果而是直接处理。这样做的缺点是,对于服务器来说,需要查询完成后才能释放资源,所以在和客户端交互的整个过程中,服务器的资源都是被这个查询所占用的。



转载于:https://my.oschina.net/xinxingegeya/blog/343109

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值