大家都用过微信,微信是怎么通信的呢:
消息被客户端包装,把发送者和接受者都发给服务端。
服务端处理消息之后,再把发送者和接受者一起发送给接受者 的客户端。
Mysql的链接方式和微信一样,也是吧不同的客户端发来的消息,经过处理之后,再返回给客户端。
一、连接方式
1、TCP/IP
真实环境中,大部分的客户端和服务端都会运行在不同的主机中。每台计算器都有它的ip地址 ,mysql通过tcp作为客户端与服务端之间网络通信协议,先采用tcp协议进行网络方面需求,像操作系统申请 一个端口号,这是一个整数值(范围在0~65535),之后就通过ip+端口号来进行网络通信。
Mysql服务器启动的时候,默认会申请3306端口号,监听3306端口。如果3306被其他进程占领,那我们在链接的时候可以用-P3307来切换,注意是大写的P,小写的p代表密码。
Mysql -h 127.0.0.1 -u root -p
此处h代表host u代表user p代表password,点击回车键之后,输入密码,因为安全性问题,密码输入的时候是看不到的,如果直接输入密码,中间不可以有空格,比如这样Mysql -h 127.0.0.1 -u root -p123456。
2、命名管道和共享内存
如果你是windows用户可以启动命名管道和共享内存来进行通信,需要注意的是,用共享内存的时候,需要保证服务端客户端在同一台windows机器上。(不了解这两个也没事,并不影响我们接下来介绍mysql)
3、Unix域套接字文件
这个也可以了解下,如果使用的操作系统为类Unix系统,可以用Unix域套接字文件来进行通信,启动时候加参数
mysqld --socket=/tmp/a.txt
mysql -hlocalhost -uroot --socket=/tmp/a.txt -p
这样该客户端进程和服务器进程就可以通过路径为/tmp/a.txt的Unix域套接字文件进行通信了。
二、服务器处理客户端请求
不论什么连接方式,最后实现的都是,客户端进程向服务器进程发送一段mysql语句文本,服务端返回给客户端一段处理结果文本。那客服端接收到mysql语句文本之后,又是如何处理的呢?流程为,客户端发送增删查改请求,第一步为连接管理,第二步为解析与优化,第三步为存储引擎。
1、连接管理
客户端通过上面介绍的方法都可以连接服务端,每当有一个客户端进来时,服务端会创建一个专门的线程来管理这个客户端,当客户端断开连接的时候,当前线程也不会销毁,当新的客户端来时,用当前线程管理新的客户端,从而节省开销。
客户端连接的时候,会携带主键的信息,用户名,密码,如果认证失败,则拒绝连接,当客户端和服务端不在同一台机器的时候,会采用ssh(安全套节字)进行网络通信,保证数据传输安全性。
2、解析与优化
当有相同请求的时候,mysql会吧请求的数据缓存起来,下次任何客户端过来都能访问。 但如果两次sql多了一个空格或者注释,大小写不一样,也不会触发缓存,系统表比如mysql也不会发生缓存,还有如果有函数,比如now也不会触发缓存,因为每次查询的结果不一样,缓存就没必要。
缓存失效什么时候呢?只要这站表被insert,update,delete,drop等,就会把数据从高速缓存中清除。(缓存虽然可以提高查询性能,但也会造成开销,比如每次查询需要查询缓存里的检索,然后在更新缓存,维护改缓存的区域,mysql从5.7.20推荐健使用查询缓存,8.0之后删除)
3、语法解析
当没有当前缓存的时候,则开始正是查询,因为发过来的只是一段文本,需要把sql语句的一些表,查询的列,搜索条件等放在mysql服务器数据结构上,来编译解析当前文本。
4、查询优化
语法解析后,获取到了表,列和所搜条件,但sql语句的查询效率不高,mysql会对语句做些优化,比如表达式简化,子查询转为连接,外连接转为内连接等,优化的结果就是生成一个mysql的执行计划。我们也可以用EXPLAIN语句来检测sql语句怎么样。
5、存储引擎
查询优化完毕之后,这时候才去访问mysql真实的数据库,储存引擎,我们的表是一行一行数据组成的,怎么从表里读写数据,怎么把数据写入物理存储器上,这都是存储引擎干的事。
为了方便管理,人们把不涉及数据的部分,连接管理,查询缓存,语法解析,查询优化分为Mysql-Service,存储的部分叫存储引擎。当sqlservie调用存储引擎的时候,会直接调用底层api函数,获取返回数据。
我们常用的存储引擎有两种,默认的是innoDB,支持事务查询。Myisam非事务存储引擎。