一条SQL查询语句是如何执行的?

 

本文转载自微信公众号「蝉沐风」,作者跑码场。转载本文请联系蝉沐风公众号。

MySQL是典型的C/S架构(客户端/服务器架构),客户端进程向服务端进程发送一段文本(MySQL指令),服务器进程进行语句处理然后返回执行结果。

问题来了。服务器进程对客户端发送的请求究竟做了什么处理呢?本文以查询请求为例,讲解MySQL服务器进程的处理流程。

如下图所示,服务器进程在处理客户端请求的时候,大致需要进行3个步骤:

处理连接解析与优化存储引擎

接下来我们来详细了解一下这3步具体都做了什么。

一条SQL查询语句是如何执行的?插图亿华云

1. 处理连接

客户端向服务器发送请求并最终收到响应,本质上是一个进程间通信的过程。

MySQL有专门用于处理连接的模块——连接器。

1.1 客户端和服务端的通信方式

1.1.1 TCP/IP协议

TCP/IP协议是MySQL客户端和服务器最常用的通信方式。

我们平时所说的MySQL服务器默认监听的端口是3306,这句话的前提是客户端进程和服务器进程使用的是TCP/IP协议进行通信。

我们在使用mysql命令启动客户端程序时,只要在-h参数后跟随IP地址作为服务器进程所在的主机地址,那么通讯方式便是TCP/IP协议。

如果客户端进程和服务器进程位于同一台主机,且要使用TCP/IP协议进行通信,则IP地址需要指定为127.0.0.1,而不能使用localhost

1.1.2 UNIX域套接字

如果客户端进程和服务器进程都位于类UNIX操作系统(MacOS、Centos、Ubuntu等)的主机之上,并且在启动客户端程序时没有指定主机名,或者指定的主机名为localhost,又或者指定了--protocol=socket的启动参数,那么客户端进程和服务器进程就会使用UNIX域套接字进行进程间通信。

MySQL服务器进程默认监听的UNIX域套接字文件为/temp/mysql.sock,客户端进程启动时也默认会连接到这个UNIX域套接字文件之上。

如果不明白UNIX域套接字到底是什么也没关系,只要知道这是进程之间的一种通讯方式就可以了,这里提及的主要目的是希望读者知晓MySQL客户端和进程通讯方式不止于TCP/IP协议

1.1.3 命名管道和共享内存

如果你的MySQL是安装在Windows主机之上,客户端和服务器进程可以使用命名管道和共享内存的方式进行通信。

不过使用这些通信方式需要在服务端和客户端启动时添加一些启动参数。

使用命名管道进行通信。需要在启动服务器时添加--enable-named-pipe参数,同时在启动客户端进程时添加--pipe或者--protocol=pipe参数使用共享内存进行通信。需要在启动服务器时添加--shared-memory参数,启动成功后,共享内存便成为本地客户端程序的默认连接方式;也可以在启动客户端进程的命令中加上--protocol=memory参数明确指定使用共享内存进行通信

如果不明白命名管道和共享内存到底是什么没关系,只要知道这是进程之间的一种通讯方式就可以了,这里提及的主要目的是希望读者知晓MySQL客户端和进程通讯方式不止于TCP/IP协议

1.2 权限验证

确认通信方式并且成功建立连接之后,连接器就要开始验证你的身份了,使用的信息就是你的用户名和密码。

如果用户名或者密码错误,客户端连接会立即断开如果用户名密码认证通过,连接器会到权限表里面查出当前登陆用户拥有的权限。之后这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。

1.3 查看MySQL连接

每当一个客户端连接到服务端时,服务端进程都会创建一个单独的线程来处理当前客户端的交互操作。

那么如何查看MySQL当前所有的连接?

mysql

THE END
Copyright © 2024 亿华云