Mysql客户端和服务端如何通信

      最后更新:2022-07-14 11:28:55 手机定位技术交流文章

      如何与Mysql客户端和服务端沟通

      如何连接客户和服务端

      运行MySQL客户端程序和服务器程序实际上是操作系统上的一个进程,而客户端和服务器之间的通信实际上是两个进程之间。MySQL支持下列三个通信模式。

      TCP/IP

      在常规程序开发中,服务端和客户更有可能不会在同一主机上运行,因此,服务端和客户端之间的通信需要依靠网络传输,Mysql最常用的是TCP/IP格式,服务端口默认监视3306端口,当然,我们可以修改我的。 cnf文件允许服务端监视其他端口,然后使用客户端程序可以启动mysql -h{Service端 IP} -uroot -P3307 -p命令其中

      -h{服务端IP}显示指定的MySQL服务端IP.

      -P3307显示指定服务提供者监视的端口号码。 默认3306 如果服务提供者修改默认监视端口号码,客户端可以使用-P指定。

      命名管道和共享内存

      使用这两个通信方式有两个前提

      • 你需要Windows环境。

      • 客户和服务端需要在同一机器上。

      事实上,基于这两个点,这两个通信模式注定不会在生产中使用,因为生产环境服务器大多是Linux服务器,而生产客户端和服务端不太可能在同一服务器上,所以这个模式是可以理解的。

      Unix域插座文件

      使用这种通信方式还有两个条件

      • 你需要一个Unix环境。

      • 客户端和服务端在同一机器上通信,即在同一机器上进行不同的进程。

      当我们的客户启动时-h指定本地主机,例如,MySQL -hlocalhost -uroot -P3306 -p或客户端程序启动一个未指定的服务器IP(即没有-h参数),或者指定-protocol=socket的启动参数,那么就是使用了Unix域插座文件通信。

      在Mysql服务器默认监控下/tmp/mysql.sock文件,客户端也会默认连接到这个Unix域插座文件,如下所示(文件类型为s,代表套接字文件)。

      图片

      当然,这个文件可以由用户重新指定

      服务端:mysqld --socket=/tmp/a.txt

      客户端:mysql -hlocalhost -uroot --socket=/tmp/a.txt -p

      Unix域插座文件通信的好处就是减少了网络通信带来的资源消耗,客户端和服务端在同一个服务器下就可以采用此方案。

      服务端处理过程

      其实不论客户端和服务端如何通信,其实最终的效果就是客户端向服务端发送一段文本(SQL语句),服务端向客户端返回一段文本(处理结果),那么服务端具体如何操作呢?大致过程如下图所示。

      图片

      连接器

      客户端和服务端采用TCP/IP、命名管道和共享内存、Unix域插座文件多种连接方式建立连接后,服务端创建一个专为与客户端交互的线程,当客户端断开后,服务结束不会摧毁这个线路。相反,它被缓存并用于连接到其他客户端。在建立客户端与服务端之间的连接后,服务端程序将验证客户端提供的身份信息,身份验证失败的服务终止程序将拒绝连接。

      查询缓存

      当客户A完成对句子的查询时,Mysql将将查询声明和结果放在缓存中,当客户端B使用相同的查询声明来查询时,缓存被消灭。但请注意 MySQL服务器不是聪明的,如果两个查询语句不同于任何字符,如空格、注释、大小等,所有这些都会导致缓存失败,如下SQL,最后的执行结果是一致的,但没有指定相同的缓存。

      除上述以外,请注意一些没有缓存的场景

      • 查询SQL包含一些系统功能,例如NOW每次调用都会产生新的结果,无法缓存。

      • 查询SQL包含一些系统表,如mysql、information_schema和 performance_schema,因为系统表需要获取最新的结果,所以这些表没有缓存。

      • 用户定义变量和函数

      在缓存中有一些故障

      Mysql的缓存系统监视所有涉及的表,如果对缓存中的表使用了INSERT、UPDATE、DELETE、TRUNCATE TABLE、ALTER TABLE、DROP TABLE或 DROP DATABASE语句,然后这些表的相应的缓存将被禁用。

      缓存适当的使用确实能提升系统的查询性能,但对于Mysql来讲维护成本太高,所以在5.7.20就默认关闭了缓存不推荐使用,在Mysql8.0彻底移除了缓存功能。

      分析器

      进入这个阶段表示缓存不运行,然后进入正式查询阶段,分析客户端发送的文本,判断语法是否正确,然后提取需要查询的表,需要查询的列,需要查询的条件等信息,载入MySQL。

      本文的基本内容是编写、文法分析、文法分析、语义分析。

      优化器

      在分析分析器之后,我们可以得到查询的表、查询的列、筛选条件,但这些不够,我们需要优化器决定在表中有多个索引时使用哪个索引,或者在句子中关联多少表,来决定每个表的连接顺序,如下。

      该SQL首先从表中提取ID=11记录的Sno值,然后将Sno值与G表关联,然后决定G表中的ID值是否等于11。

      也可以先从表g中取出id=111记录的sno值,再根据sno值关联到表s中,再判断s表中id值是否等于1111。

      这两个程序的执行结果是一致的,但执行效率可能有所不同,因此优化器决定使用哪个程序。

      优化的结果是创建执行计划

      执行器

      Mysql知道需要通过分析器做些什么,知道如何通过优化器做,然后进入执行器开始执行SQL文。

      假设将执行下列SQL

      执行人员的步骤大致如下:

      • 执行器调用执行引擎提供的接口以取这个表的第一个行,并决定ID值是否为11。如果不是,它跳过并保存记录到结果中心。

      • 调用引擎接口接下一行,重复相同的判断逻辑,直到它接到这个表记录的最后一行。

      • 执行器将结果集合返回到客户端,作为符合上述过渡条件的所有行的记录集合。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/29580.html

          热门文章

          文章分类