MySQL 客户端/服务器端通信协议 - Go语言中文社区

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


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


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

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

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

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


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


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



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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_34197488/article/details/92643997
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 15:48:44
  • 阅读 ( 837 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢