1.6 服务器处理客户端请求

news2025/1/13 13:21:33

客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。

从图中我们可以看出,服务器程序处理来自客户端的查询请求大致需要经过三个部分,分别是 连接管理 、 解析与优化 、 存储引擎 。

1.6.1 连接管理

客户端进程可以采用我们上边介绍的 TCP/IP 、 命名管道或共享内存 、 Unix域套接字 这几种方式之一来与服务器进程建立连接,每当有一个客户端进程连接到服务器进程时,服务器进程都会创建一个线程来专门处理与这个客户端的交互,当该客户端退出时会与服务器断开连接,服务器并不会立即把与该客户端交互的线程销毁掉,而是把它缓存起来,在另一个新的客户端再进行连接时,把这个缓存的线程分配给该新客户端。这样就起到了不频繁创建和销毁线程的效果,从而节省开销。从这一点大家也能看出, MySQL 服务器会为每一个连接进来的客户端分配一个线程,但是线程分配的太多了会严重影响系统性能,所以我们也需要限制一下可以同时连接到服务器的客户端数量。

在客户端程序发起连接的时候,需要携带主机信息、用户名、密码,服务器程序会对客户端程序提供的这些信息进行认证,如果认证失败,服务器程序会拒绝连接。另外,如果客户端程序和服务器程序不运行在一台计算机上,我们还可以采用使用了 SSL (安全套接字)的网络连接进行通信,来保证数据传输的安全性。

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

1.6.2 解析与优化

1.6.2.1 查询缓存

MySQL服务器处理查询请求的时候,会把刚刚处理过的查询请求和结果缓存起来,如果下次有一样的请求过来,直接从缓存中查找结果就好了。这个查询缓存可以在不同客户端之间共享,也就是说如果客户端A刚刚查询了一个语句,而客户端B之后发送了同样的查询请求,那么客户端B的这次查询就可以直接使用查询缓存中的数据。

不过,如果两个查询请求在任何字符上的不同(例如:空格、注释、大小写),都会导致缓存不会命中。另外,如果查询请求中包含某些系统函数、用户自定义变量和函数、一些系统表,如mysql 、information_schema、 performance_schema 数据库中的表,那这个请求就不会被缓存。

既然是缓存,那就有它缓存失效的时候。MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,如对该表使用了 INSERT 、 UPDATE 、 DELETE 、 TRUNCATE TABLE 、 ALTER TABLE 、 DROP TABLE 或DROP DATABASE 语句,那使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除。

1.6.2.2 语法解析

如果查询缓存没有命中,接下来就需要进入正式的查询阶段了。因为客户端程序发送过来的请求只是一段文本而已,所以 MySQL 服务器程序首先要对这段文本做分析,判断请求的语法是否正确,然后从文本中将要查询的表、各种查询条件都提取出来放到 MySQL 服务器内部使用的一些数据结构上来。

1.6.2.3 查询优化

语法解析之后,服务器程序获得到了需要的信息,比如要查询的列是哪些,表是哪个,搜索条件是什么等等。因为我们自己写的效率不够高,MySQL 的优化程序会对我们的语句做一些优化,如外连接转换为内连接、表达式简化、子查询转为连接等,优化的结果就是生成一个执行计划,这个执行计划表明了应该使用哪些索引进行查询,表之间的连接顺序是啥样的。我们可以使用EXPLAIN 语句来查看某个语句的执行计划。

1.6.3 存储引擎

截止到服务器程序完成了查询优化为止,还没有真正的去访问真实的数据表, MySQL 服务器把数据的存储和提取操作都封装到了一个叫 存储引擎 的模块里。我们知道 表 是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是 存储引擎 负责的事情。为了实现不同的功能, MySQL 提供了各式各样的 存储引擎 ,不同 存储引擎 管理的表具体的存储结构可能不同,采用的存取算法也可能不同。

为了管理方便,人们把 连接管理 、 查询缓存 、 语法解析 、 查询优化 这些并不涉及真实数据存储的功能划分为 MySQL server 的功能,把真实存取数据的功能划分为 存储引擎 的功能。各种不同的存储引擎向上边的 MySQLserver 层提供统一的调用接口(也就是存储引擎API),包含了几十个底层函数,像"读取索引第一条内容"、"读取索引下一条内容"、"插入记录"等等。

所以在 MySQL server 完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数据后返回给客户端就好了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/927192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端需要理解的 React 知识

1 框架通识 1.1 MVVM、MVC和MVP MVC、MVP 和 MVVM 是三种常见的软件架构设计模式。主要通过分离关注点的方式来组织代码结构,优化开发效率。 MVC将应用抽象为数据层(Model)、视图层(View)、逻辑层(contr…

解锁Selenium的力量:不仅仅是Web测试

Selenium简介 Selenium,作为Web应用测试的领军者,已经成为了无数开发者和测试人员的首选工具。它不仅仅是一个自动化测试工具,更是一个强大的Web应用交互框架。 Selenium的起源与发展 Selenium的历史可以追溯到2004年,由Jason Hu…

二叉树、红黑树、B树、B+树

二叉树 一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。 二叉树的特点: 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。二叉树的子树有左右之分&#xf…

【算法刷题之哈希表(2)】

目录 1.leetcode-454. 四数相加 II2.leetcode-383. 赎金信(1)暴力解法(2)哈希法 3.leetcode-205. 同构字符串(1)哈希法(2)直接对比查找 4.leetcode-128. 最长连续序列5.总结 1.leetc…

抖音小程序商城开发制作源码 含多套模板+部署搭建教程

分享一个抖音小程序商城的制作源码,含多套模板、模块化自由DIY功能和完整的搭建部署教程。程序支持除抖音小程序商城制作外,还支持一键同步微信、支付宝、百度、今日头条端小程序。 抖音小程序商城的基本架构包括前端页面和后端管理平台两部分。前端页面…

【FPGA】FPGA入门 —— 基本开发流程

FPGA入门 1. FPGA入门2. FPGA开发流程3. 二选一多路器 - 快速熟悉开发环境及流程 1. FPGA入门 快速上手verilog语法状态机,线性序列机FPGA常见的设计方法自己写代码,下载代码进行使用,使用厂家/第三方提供的IP核常见接口设计 等等。。 学习…

白介素对NK细胞功能的影响(IL-1β、IL-12、IL-15、IL-18、IL-21)

1、促进NK细胞扩增和活化:IL-2/21 Soiffer RJ等自1996年起即报道IL-2低剂量持续输注和间歇给药对转移癌患者的CD56NK细胞有明显扩增效果。大部分NK细胞表面具有IL-2中亲和性受体,IL-2诱导NK的杀伤活性约需18~24小时。此外,IL-2还…

Docker安装Jenkins实操记录

前置条件: 1、安装了docker 2、安装了java(没有安装情况下,可运行:yum install -y java-1.8.0-openjdk-devel.x86_64) 一、拉取镜像 1、docker pull jenkins/jenkins 2、mkdir -p /usr/local/jenkins 3、chmod 777 …

模型崩溃,ChatGPT变“笨”了?最新评估结果揭示真相原因

​ChatGPT性能是否变化? 人们可能会好奇,像ChatGPT这样的AI系统是否会因为太聪明而最终无法被人类所驾驭使用。但是,最近的一项研究表明,ChatGPT正在变得越来越糟糕。[1] OpenAI的ChatGPT帮助了无数人更高效地使用互联网。无论是…

php 多维数组排序,根据某一列排序(array_multisort()和array_column()联用)

array_multisort()和array_column()联用效果直接叠满,11>100 先来看下两个函数的介绍和用法 array_column(): 一般模式,不需要其中字段作为id,只需要提取val值 <?php // 可能从数据库中返回数组 $a [[id > 5698, first_name > Peter, last_name > G…

【AndroidStudio】屏蔽小米打印

使用小米手机调试时&#xff0c;会一直有notifyQueue load error的打印 在过滤器重添加过滤条件即可 -message:notifyQueue

ISO-16750-1,2,3,4,5_2023 道路车辆 — 电气和电子设备的环境条件和测试 ,标准汇总

目录 一、ISO 16750标准各Part部分当前状态&#xff1a; ISO 16750-2023 合集1-5包下载&#xff1a;https://download.csdn.net/download/std7879/88251235 二、ISO 16750标准各Part部分描述的内容&#xff1a; ISO 16750-1:2023Part 1: General概述 ISO 16750-2:2023 Part…

8路模拟信号采集FMC子卡模块推荐哪些?

FMC168是一款基于VITA57.4标准的2GSPS/2.6GSPS/3GSPS采样率14位分辨率Double FMC子卡模块&#xff0c;该模块可以实现8路14-bit、2GSPS/2.6GSPS/3GSPS采样率模拟信号采集。该板卡ADC器件采用ADI公司的AD9208芯片,该芯片与AD9689完全兼容&#xff0c;可以实现不同的采样率范围。…

微信小程序客服系统-两种形式:嵌入页面传递更多信息 与 自带组件形式

微信小程序对接有两种方式&#xff1a;webview组件嵌入页面&#xff0c;小程序客服组件对接消息 使用webview组件嵌入聊天页面形式。这种形式更加的灵活可控&#xff0c;可以传递更多的信息给到客服&#xff0c;例如可以把用户的手机号&#xff0c;所在页面的产品信息等带入进来…

Dubbo3之SerializingExecutor

前言 Dubbo3 提供了一个挺有意思的 Executor&#xff0c;用来将提交到线程池里的任务按顺序串行执行。 需求背景&#xff1a;你有一个线程池&#xff0c;但是你不想修改它&#xff0c;现在你的需求是要把提交上去的任务按顺序串行执行。 在这样一个需求背景下&#xff0c;Ser…

Text-to-SQL小白入门(三)IRNet:引入中间表示SemQL

摘要 本文主要介绍了IRNet论文的基本信息&#xff0c;比如标题、摘要、数据集、结果&结论&#xff0c;以及论文中提出的不匹配问题和词汇问题以及对应的解决方案&#xff0c;重点学习了中间表示SemQL。 引言 学习论文时&#xff0c;可以先粗略看看论文标题-摘要-数据集-结…

YB2411是一款内部集成有高边高压功率MOSFET管的高频率(2MHz)降压型开关稳压器。

概述&#xff1a; YB2411是一款内部集成有高边高压功率MOSFET管的高频率(2MHz)降压型开 关稳压器。提供单路最大0.6A高效率输出&#xff0c;以电流模式控制方式达到快速环路响 应。 宽范围输入电压(33V至36V)可在移动环境输入的条件下实现各种降压型电 源变换的应用。1uA的…

为什么产品经理不适合做项目经理呢?

虽然产品经理需要具备一定的项目能力&#xff0c;但在实际执行过程中&#xff0c;通常会在开发团队中设置一个类似项目经理的角色&#xff0c;负责把控项目进度和质量。一般情况下&#xff0c;技术经理就是项目经理。 技术型项目经理的特点如下&#xff1a; 充当救火队员的角…

C#矩阵XY排序

矩阵XY快速排序 using MyVision.Script.Method;public class MyScript : ScriptMethods {//struct MOTIONPOSXY_S{public double Pos_x;public double Pos_y;};//脚本执行该方法public bool Process(){//try{//脚本代码写在下方 List<double> PointX GetDoubleList(&qu…

会员管理系统实战开发教程03-会员管理功能

我们上篇介绍了会员管理的列表页&#xff0c;及新增功能开发。本篇我们继续我们的会员管理功能&#xff0c;介绍一下详情、修改、删除功能。 1 创建详情页 打开控制台&#xff0c;点击创建页面的图标&#xff0c;创建详情页 2 数据详情组件 详情页我们也是使用数据容器组…