最后更新:2022-07-14 11:28:55 手机定位技术交流文章
运行MySQL客户端程序和服务器程序实际上是操作系统上的一个进程,而客户端和服务器之间的通信实际上是两个进程之间。MySQL支持下列三个通信模式。
在常规程序开发中,服务端和客户更有可能不会在同一主机上运行,因此,服务端和客户端之间的通信需要依靠网络传输,Mysql最常用的是TCP/IP格式,服务端口默认监视3306端口,当然,我们可以修改我的。 cnf文件允许服务端监视其他端口,然后使用客户端程序可以启动mysql -h{Service端 IP} -uroot -P3307 -p命令其中
-h{服务端IP}显示指定的MySQL服务端IP.
-P3307显示指定服务提供者监视的端口号码。 默认3306 如果服务提供者修改默认监视端口号码,客户端可以使用-P指定。
使用这两个通信方式有两个前提
你需要Windows环境。
客户和服务端需要在同一机器上。
事实上,基于这两个点,这两个通信模式注定不会在生产中使用,因为生产环境服务器大多是Linux服务器,而生产客户端和服务端不太可能在同一服务器上,所以这个模式是可以理解的。
使用这种通信方式还有两个条件
你需要一个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。如果不是,它跳过并保存记录到结果中心。
调用引擎接口接下一行,重复相同的判断逻辑,直到它接到这个表记录的最后一行。
执行器将结果集合返回到客户端,作为符合上述过渡条件的所有行的记录集合。
本文由 在线网速测试 整理编辑,转载请注明出处。