0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一条SQL查询语句是怎么去执行的?(上)

jf_78858299 来源:蝉沐风的码场 作者:蝉沐风 2023-03-03 09:58 次阅读

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

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

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

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

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

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> show global status like 'Thread%';

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 1     |
| Threads_created   | 1     |
| Threads_running   | 1     |
+-------------------+-------+

各字段含义如下表

字段 含义
Threads_cached 缓存中的线程连接数
Threads_connected 当前打开的连接数
Threads_created 为处理连接创建的线程数
Threads_running 非睡眠状态的连接数,通常指并发连接数

建立连接之后,除非客户端主动断开连接,否则服务器会等待客户端发送请求。但是线程的创建和保持是需要消耗服务器资源的,因此服务器会把长时间不活动的客户端连接断开。

有2个参数控制这个自动断开连接的行为,每个参数都默认为28800秒,8小时。

-- 非交互式超时时间,如JDBC连接
mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+

-- 交互式超时时间,如数据库查看工具Navicat等
mysql> show global variables like 'interactive_timeout';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| interactive_timeout | 28800 |
+---------------------+-------+

既然连接消耗资源,那是不是MySQL的最大连接数也有默认限制呢?没错!默认最大连接数为151。

mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+

题外话:细心的读者可能会发现MySQL某些查询语句带有global关键字,这个关键字有什么含义呢?

MySQL的系统变量有两个作用范围(不区分大小写),分别是

  • GLOBAL(全局范围):变量的设置影响服务器和所有客户端
  • SESSION(会话范围):变量的设置仅影响当前连接(会话)

但是并非每个参数都具有两个作用范围,比如允许同时连接到服务器的客户端的数量max_connections就只有全局级别。

当没有带作用范围关键字时,默认是SESSION级别,包括查询和修改操作。

比如修改一个参数之后,在当前窗口生效了,但是在其他窗口却没有生效

show VARIABLES like 'autocommit';
set autocommit = on;

因此,如果只是临时修改,请使用SESSION级别,如果需要当前设置在其他会话中生效,需要使用GLOBAL关键字。

到此为止,服务器进程已经和客户端进程建立了连接,下一步将处理客户端传来的请求了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    9021

    浏览量

    85183
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1350

    浏览量

    78986
  • MySQL
    +关注

    关注

    1

    文章

    802

    浏览量

    26444
  • 服务端
    +关注

    关注

    0

    文章

    66

    浏览量

    6987
收藏 人收藏

    评论

    相关推荐

    STM8L执行一条语句大概需要几个时钟周期?

    STM8L执行一条语句大概需要几个时钟周期
    发表于 05-06 06:16

    在Delphi中动态地使用SQL查询语句

    在Delphi中动态地使用SQL查询语句般的数据库管理系统中,通常都需要应用SQL查询
    发表于 05-10 11:10

    DSP执行一条语句的时间

    CPU配置成150M。高频时钟75M。 那么执行一条语句的时间是多少呢
    发表于 10-15 11:28

    select语句和update语句分别是怎么执行

    样,但是具体的实现还是有区别的。 当然深入了解select和update的具体区别并不是只为了面试,当希望Mysql能够高效的执行的时候,最好的办法就是清楚的了解Mysql是如何执行查询
    的头像 发表于 11-03 09:41 3526次阅读
    select<b class='flag-5'>语句</b>和update<b class='flag-5'>语句</b>分别是怎么<b class='flag-5'>执行</b>的

    一条SQL语句是怎么被执行

    直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面
    的头像 发表于 09-12 09:44 1492次阅读
    <b class='flag-5'>一条</b><b class='flag-5'>SQL</b><b class='flag-5'>语句</b>是怎么被<b class='flag-5'>执行</b>的

    简述SQL更新语句执行流程1

    之前我们讲过了一条SQL查询语句是如何执行的,那么插入(INSERT)、更新(UPDATE)和删除(DELETE)操作的流程又是什么样子呢?
    的头像 发表于 02-14 15:40 589次阅读
    简述<b class='flag-5'>SQL</b>更新<b class='flag-5'>语句</b>的<b class='flag-5'>执行</b>流程1

    简述SQL更新语句执行流程2

    之前我们讲过了一条SQL查询语句是如何执行的,那么插入(INSERT)、更新(UPDATE)和删除(DELETE)操作的流程又是什么样子呢?
    的头像 发表于 02-14 15:40 506次阅读
    简述<b class='flag-5'>SQL</b>更新<b class='flag-5'>语句</b>的<b class='flag-5'>执行</b>流程2

    一条SQL查询语句是怎么执行的?(中)

    MySQL是典型的`C/S架构`(客户端/服务器架构),客户端进程向服务端进程发送段文本(MySQL指令),服务器进程进行语句处理然后返回执行结果。
    的头像 发表于 03-03 09:58 431次阅读
    <b class='flag-5'>一条</b><b class='flag-5'>SQL</b><b class='flag-5'>查询</b><b class='flag-5'>语句</b>是怎么<b class='flag-5'>去</b><b class='flag-5'>执行</b>的?(中)

    一条SQL查询语句是怎么执行的?(下)

    MySQL是典型的`C/S架构`(客户端/服务器架构),客户端进程向服务端进程发送段文本(MySQL指令),服务器进程进行语句处理然后返回执行结果。
    的头像 发表于 03-03 09:58 377次阅读
    <b class='flag-5'>一条</b><b class='flag-5'>SQL</b><b class='flag-5'>查询</b><b class='flag-5'>语句</b>是怎么<b class='flag-5'>去</b><b class='flag-5'>执行</b>的?(下)

    SQL语句和自定义查询在导入包中可用

    在高级任务编辑器模式下,您可以选择要使用的操作-自己键入和编辑任何复杂性的SQL语句执行命令)或通过我们的可视化查询构建器(执行
    的头像 发表于 04-16 09:13 1124次阅读

    sql查询语句大全及实例

    SQL(Structured Query Language)是种专门用于数据库管理系统的标准交互式数据库查询语言。它被广泛应用于数据库管理和数据操作领域。在本文中,我们将为您详细介绍SQL
    的头像 发表于 11-17 15:06 1426次阅读

    sql where条件的执行顺序

    。 在深入讨论WHERE条件的执行顺序之前,先回顾一下一SQL语句执行顺序。一条
    的头像 发表于 11-23 11:31 2142次阅读

    oracle执行sql查询语句的步骤是什么

    Oracle数据库是种常用的关系型数据库管理系统,具有强大的SQL查询功能。Oracle执行SQL查询
    的头像 发表于 12-06 10:49 896次阅读

    MySQL执行过程:如何进行sql 优化

    (1)客户端发送一条查询语句到服务器; (2)服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据; (3)未命中缓存后,MySQL 通过关键字将
    的头像 发表于 12-12 10:19 382次阅读
    MySQL<b class='flag-5'>执行</b>过程:如何进行<b class='flag-5'>sql</b> 优化

    查询SQL在mysql内部是如何执行

    我们知道在mySQL客户端,输入一条查询SQL,然后看到返回查询的结果。这条查询语句在 MySQ
    的头像 发表于 01-22 14:53 535次阅读
    <b class='flag-5'>查询</b><b class='flag-5'>SQL</b>在mysql内部是如何<b class='flag-5'>执行</b>?