MySQL之客户端与服务器连接过程

客户端与服务器连接过程

MySQL客户端和服务器端本质都是计算机上的一个进程,所以客户端向服务端发起请求并得到相应,本质是进程间通信的过程,MySQL支持一下几种客户端与服务端通信的方式。

TCP/IP

真实环境中,数据库服务器进程和客户端进程一般运行在不同的主机中,不同的主机通信则必须通过网络。

MySQL使用TCP/IP作为服务器与客户端之间的网络通信协议,在网络环境下,每台计算机都有一个唯一的IP地址,

如果某个进程需要进行网络通信,就要向操作系统申请一个端口号,端口号是一个整数值,取值范围是0~65535,

网络中的其他进程可以通过IP+Port的方式与该进程建立连接,这样进程之间就可以使用网络通信了。

MySQL会在启动的时候默认申请3306端口号,之后在这个端口号上等待客户端进程进行连接,也就是MySQL会监听3306这个端口。

如果3306端口已经被其他进程占用,或者只是想修改MySQL监听的端口,可以通过-P(注意这里是大写的P,小写的是密码),来明确指定端口号,如:

mysqld -P3307

客户端想要使用TCP/IP跟服务端进程通信,就必须要指定-h参数,如何客户端和服务端在一个机器上,就用127.0.0.1来代表本机IP地址,

如果MySQL监听的不是3306端口,可以通过-P指定端口号,例如:

mysql -h127.0.0.1 -uroot -P3307 -p

命名管道和共享内存

在Windows系统下,也可以用命名管道或者共享内存的方式进行客户端与服务端之间的通信,使用这两种方式需要在服务端和客户端启动时增加一些参数。

  1. 使用命名管道进行通信,在服务端启动时增加 --enable-named-pipe 参数,之后客户端启动时增加 --pipe 或者 --protocal=pipe 参数。

  2. 使用共享内存进行通信,服务端启动时增加 --shared-memory 参数,之后客户端启动时加上 --protocol=memory 来显式指定使用共享内存进行通信。

注意,共享内存要求客户端和服务端必须在同一台机器上,命名管道和共享内存是Windows操作系统中两种进程间通信方式。

UNIX域套接字

如果服务端和客户端都运行在类Unix的同一台机器上,可以使用Unix域套接字进行进程间通信。

如果客户端启动的时候没有指定主机名,或者指定的主机名是localhost并且指定了 --protocol=socket 的启动参数,

那么服务端和客户端之间就可以通过UNIX域套接字进行通信。

MySQL默认监听的UNIX套接字文件是 /tmp/mysql.sock ,客户端也默认连接到这个套接字文件,如果想改变这个默认的文件,可以在启动程序时指定socket参数,如下:

mysqld --socket=/tmp/a.txt

用上面的命令启动后,MySQL服务器将监听该套接字文件,客户端需要通过套接字通信时,也需要显式的指定该文件,如下:

msyql -hlocalhost -uroot --socket=/tmp/a.txt -p

服务器处理客户端请求

客户端与服务端无论以何种方式进行通信,最后实现的效果都是客户端进程向服务端进程发送一段文本(MySQL语句),

服务端进程处理后再返回一段文本(处理结果),当客户端发送一段SQL到服务端,服务端大致要经过如下的几步处理(连接管理、解析与优化、存储引擎):

1. 连接管理

客户端可以使用TCP/IP,命名管道、共享内存、UNIX域套接字几种方式与服务端进行连接。

每当一个客户端连接到服务端时,服务端都会创建一个线程专门处理与这个客户端的交互;当客户端退出时会与服务端断开连接,

服务端并不会立即把与该客户端交互的线程销毁,而是把它缓存起来,当另一个客户端进行连接时,把这个缓存的线程与该客户端建立连接,这样就不会频繁的创建和销毁线程,从而节省开销,

如果服务端分配太多的线程会严重影响系统的性能,因此可以通过配置来限制客户端连接到服务端的数量。

客户端程序发起连接时,需要携带主机、用户名、密码等信息,服务端会对这些信息进行认证,如果认证失败,服务端会拒绝连接,如果客户端与服务端不在一台机器上,可以通过采用传输层安全性协议(TLS)对连接进行加密,以此保证数据传输的安全性,

当连接建立后,与客户端关联的线程将会一直等待客户端发送过来的请求,MySQL服务端收到的只是一个文本信息,还需要经过各种处理。

2. 解析与优化

当收到客户端传入的文本信息后,需要做出解析优化等操作。

2.1 查询缓存

MySQL会将客户端的查询结果做缓存处理,并且这个结果在多个客户端之间是通用的,例如相同的SQL语句,命中缓存后,将直接返回缓存结果,

例如 1+2+3+4, 第一次将进行一次计算,返回最终的结果10,第二次再来一次,将不用计算,直接返回10.

MySQL以客户端传递的文本作为查找缓存的key,这个文本有任何的不同都无法找到缓存,除此如果查询请求中含有系统函数(例如NOW())、用户自定义变量和函数、系统表(例如mysql、information_schema、performance_schema数据库中的表),

也无法命中缓存,例如系统函数NOW(),每次查询都要返回系统最新的时间,如果第二次查询还用第一次的结果显然是错误的,

MySQL会监控缓存设计的每张表,当发生了关联的表结构或数据更改,例如对该表使用了INSERT、UPDATE、DELETE、TRUNCATETABLE、ALTER TABLE、DROP TABLE 或 DROP DATABASE 语句,

则与该表相关的所有查询缓存都将变为无效并从缓存中删除。

查询缓存虽然可以提高系统性能,但也需要维护缓存多出一些开销,例如每次都需要去缓存中查询,请求处理完后还需要更新查询缓存,还需要分配相应的内存空间,从MySQL5.7.20开始,不推荐使用查询缓存,在8.0,查询缓存功能直接被删除了。

2.2 语法解析

当缓存没有命中时,即进入正式的查询阶段,此时将客户端传入的文本进行分析,判断语法是否正确,然后将文本中需要查询的表、各种查询条件都存放到数据结构中,

本质上语法解析是一个编译过程,涉及词法解析、语法分析、语义分析等阶段。

2.3 查询优化

经过语法解析后,知道了需要查询的表、字段以及查询条件是什么后,还需要对查询的效率做出优化,保证最快的查询速度,

例如外连接转换为内连接,表达式简化、子查询转为连接等等优化,最终优化结果会产生一个执行计划,该执行计划表名了应该使用哪些索引查询以及表之间的连接顺序是怎么样的等等,可以使用explain语句查看执行计划。

经过连接、解析优化之后,将进行到存储引擎中的数据查找处理。

 

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值