MySQL-逻辑架构

MySQL-逻辑架构

1.逻辑架构剖析

1.1服务器处理客户端请求

MySQL属于典型的C/S架构,客户端进程发送请求,服务端进程处理请求。处理的基本流程如下。

在这里插入图片描述

MySQL的逻辑架构如下:

在这里插入图片描述

Connectors:与服务端程序连接的程序。

Manager Services & Utilties:基础服务组件;

Connection Pool:提供多个客户端和服务端交互的线程并进行管理;

SQL Interface:接收SQL指令,返回查询结果;

Parser:语法分析,语义分析,生成语法树;

Optimizer:核心组件,对SQL进行优化;

Caches & Buffers:查询缓存,以键值对方式缓存查询结果;

Pluggable Storage Engines:存储和组织数据的方式;

File System :文件系统;

查询数据的流程:

Connectors-> Connection Pool ->SQL Interface->Cache & Buffers->Parser->Optimizer->Pluggable Storage Engines->File System-> Cache & Buffers -> SQL Interface

1.2连接层

访问MySQL服务前,首先需要建立TCP连接,并对客户端传输的账号密码进行身份认证、权限获取。

  1. 用户名或密码错误:拒绝连接数据库。
  2. 认证通过,根据权限表查询用户权限,后面的权限判断逻辑,都依赖于该查询结果。

MySQL服务器可以和多个客户端进行连接,为了避免无限制创建TCP连接将系统资源消耗尽。MySQL中提供TCP连接池限制连接数。采用长连接的方式复用TCP连接。

TCP收到请求后,需要线程对请求进行处理,因此还需要有线程池,执行后续流程。

1.3服务层

提供了大部分核心服务功能,并完成缓存的查询,该层会将SQL语句解析查询并创建相应的内部解析树,并进行优化。

1.4引擎层

负责对数据的存储和提取,MySQL服务器通过API与引擎进行通信并查询结果。

在这里插入图片描述

不同的存储引擎实现的功能不同,可以根据具体的需求,选择存储引擎。

2.SQL的执行流程

在这里插入图片描述

2.1查询缓存

如果在查询缓存中发现一条和当前查询完全相同的SQL语句,就会将结果直接返回给客户端;如果没有则进入解析器阶段。但是查询缓存效率往往不高,因此在MySQL之后抛弃了该功能。

 -- 查询是否开启缓存show global  variables like '%query_cache_type%';
-- 0(OFF):关闭查询缓存 1:开启缓存(ON)  2:按需使用(DEMAND)
SET GLOBAL query_cache_type=1;
-- 显示指定使用查询缓存
SELECT SQL_CACHE * FROM t1 where id = 1;
-- 查看缓存的状态
SHOW STATUS LIKE '%Qcache%';

2.2解析器

分析器先做“词法分析”,MySQL需要识别里面的字符串分别是什么,代表什么(什么是关键字、列名、表名等)。然后做词法分析,根据词法分析的结果,语法分析器会根据语法规则,判断输入的SQL语句是否满足语法要求,如果检查出语句不对,会返回"You hava an error in your SQL syntax"的错误提醒。

2.3优化器

一条语句查询可以有很多种执行方式,返回的结果都相同,但是时间不一定相同,因此优化器会对SQL进行优化,在优化器中会确定SQL语句的执行路径,比如是根据全表索引,还是根据索引检索等。

物理查询优化:通过索引和表连接方式等技术来进行优化。

逻辑查询优化:通过SQL等价变换提升查询效率。

2.4执行器

执行之前需要判断用户是否具备权限,如果没有,则返回权限错误。如果具备权限,就执行SQL查询并返回结果。如果设置了查询缓存,还会将查询结果进行缓存。

2.5预处理器

当我们频繁执行SQL时,可能一些SQL语句长的都很相似。例如下面两条SQL语句。

SELECT * FROM user WHERE id = 1;
SELECT * FROM user WHERE id = 2;

如果每一次都要对这种类似的语句进行解析会比较浪费时间,因此可以采用预编译的方式将会发送动态变化的值用占位符进行代替,将SQL语句模板化,通常称这类语句叫Prepared Statements。

-- 创建预处理SQL语句,名字可以自定义
prepare select_product from 'select * from product where id = ?';
-- 设置一个变量
set @id = 1;
-- 执行预处理SQL语句execute select_product using @id;
-- 根据名字删除预处理语句
drop prepare select _product;

2.6MySQL的执行原理

MySQL中的profiling参数,标记了当前是否开启记录SQL语句的执行信息。

select @@profiling;
-- 0代表OFF,1代表ON
set profiling = 1;
-- 查看已经执行的SQL语句情况
show profiles;
-- 查看指定行的sql语句执行情况
show profile for query 序号;

可以通过查询SQL语句的执行情况,检查SQL语句的性能如何。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 主从复制,哨兵,集群——(1)主从复制篇

目录 1. Redis 主从复制是什么? 2. Redis 主动复制能干嘛? 2.1 读写分离 2.2 容灾恢复 2.3 数据备份 2.4 水平扩展支撑高并发 3. Redis 主从复制配置项 3.1 配从库不配主库 3.2 权限密码配置 3.3 基本操作命令 4. 案例演示 4.1 案例说明 4.…

【APP源码】基于Typecho博客程序开发的博客社区资讯APP源码

全新博客社区资讯APP源码 Typecho后端 一款功能全面,用户交互良好,数据本地缓存,集成邮箱验证,在线投稿,(内置Mardown编辑器), 快捷评论的的博客资讯APP。同时兼容H5和微信小程序。 …

Electron之集成vue+vite开发桌面程序

在electron中集成vue开发桌面程序 使用我们之前创建的electron项目 创建vue 项目 命令行进入electron根目录 执行下面命令 npm create vitelatest vue -- --template vue这样就创建了一个vue项目,文件名是vue,命令行进入vue下,执行下面命…

【ajax】withCredentials

默认值:false。在获取同域资源时设置 withCredentials 没有影响。 true:在跨域请求时,会携带用户凭证 false:在跨域请求时,不会携带用户凭证;返回的 response 里也会忽略 cookie ajax中的作用 跨域请求时…

常见的 NoSQL 数据库有哪些?

前言 今天我们来介绍一下工作开发中常见的一些NoSQL数据库及其基本特点。欢迎在评论区留下文章中没有介绍且好用的NOSQL数据库🤞。 什么是(NOSQL)非关系型数据库 非关系型数据库又被称为 NoSQL(Not Only SQL ),意为不…

单片机点亮led管(01)

如何开始学习单片机 1:实践第一 2:补充必要的理论知识,缺什么补什么 3:做工程积累经验(可以在网络上收集题目,也可以有自己的想法大胆的实验) 单片机是什么? 单片机&#xff08…

实现mnist手写数字识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/Nb93582M_5usednAKp_Jtw) 中的学习记录博客** >- **🍖 原作者:[K同学啊 | 接辅导、项目定制](https://mtyjkh.blog.csdn.net/)** >- **🚀…

Linux | vim的入门手册

目录 前言 一、什么是vim 二、vim编辑器的模式 1、插入模式 (1)用vim打开文件 (2)进入插入模式 2、默认模式 (1)光标移动 (2)复制、粘贴与剪切操作 (3&#x…

互联网Java工程师面试题·Java 总结篇·第七弹

目录 68、Java 中如何实现序列化,有什么意义? 69、Java 中有几种类型的流? 70、写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。 71、如何用 Java 代码列出一个目录下所有的文件&a…

【算法练习Day21】组合剪枝

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 组合剪枝总结: …

Linux系统管理:虚拟机OpenEuler安装

目录 一、理论 1.OpenEuler 二、实验 1.虚拟机OpenEuler安装准备阶段 2.安装OpenEuler 3.进入系统 一、理论 1.OpenEuler (1)简介 欧拉(Euler)是数字基础设施的开源操作系统,可广泛部署于服务器、云计算、边缘…

BookStack 详解及 Docker-Compose 部署

BookStack 是一款用于创建文档和文档管理的开源平台。它提供了一个直观且功能丰富的界面,可用于组织和管理各种文档,包括文档编写、编辑和共享。本文将介绍 BookStack 的核心功能,并展示如何使用 Docker-Compose 快速部署 BookStack。 BookS…

34 机器学习(二):数据准备|knn

文章目录 数据准备数据下载数据切割转换器估计器 kNN正常的流程网格多折交叉训练原理讲解距离度量欧式距离(Euclidean Distance)曼哈顿距离(Manhattan Distance)切比雪夫距离 (Chebyshev Distance)还有一些自定义的距离 就请读者自行研究 再识K-近邻算法API选择n邻居的思辨总结…

c语言内功修炼--深度剖析数据的存储

前言: 我们知道在c语言中的几种基本内置数据类型,分别是: char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点数 double //双精度浮点数 在…

攻防世界web篇-Training-WWW-Robots

直接点击给出的地址,然后会转到另一个网页界面,在这个界面,已经给出了提示,robots.txt 在浏览器中,直接在地址的后面加上robots.txt,会进到下面这个界面 因为对php语言一窍不通,所以这里纯粹就…

无法访问 github ,解决办法

一、使用代理(首选) 这种办法只需要更改github.com为代理的域名即可,使用方式与GitHub除了域名不同其他都一样,速度挺快,可登陆,可提交。 1、查看当前的代理: git config --global --get htt…

VR、AR、MR、XR到底都是什么?有什么区别

目录 VRARMRXRAR、VR、MR、XR的区别 VR 英:Virtual Reality 中文翻译:虚拟现实 又称计算机模拟现实。是指由计算机生成3D内容,为用户提供视觉、听觉等感官来模拟现实,具有很强的“临场感”和“沉浸感”。我们可以使用耳机、控制器…

动态规划算法(3)--0-1背包、石子合并、数字三角形

目录 一、0-1背包 1、概述 2、暴力枚举法 3、动态规划 二、石子合并问题 1、概述 2、动态规划 3、环形石子怎么办? 三、数字三角形问题 1、概述 2、递归 3、线性规划 四、租用游艇问题 一、0-1背包 1、概述 0-1背包:给定多种物品和一个固定…

采用医疗AI、自然语言处理技术的java智能导诊导医系统源码

一套java智能导诊导医系统源码(演示自主版权商业项目应用) 随着人工智能技术的快速发展,语音识别与自然语言理解技术的成熟应用,基于人工智能的智能导诊导医逐渐出现在患者的生活视角中,智能导诊系统应用到医院就医场景…

Kotlin Compose Multiplatform 跨平台开发实践之加入 iOS 支持

前言 几个月前 Compose Multiplatform 的 iOS 支持就宣布进入了 Alpha 阶段,这意味着它已经具备了一定的可用性。 在它发布 Alpha 的时候,我就第一时间尝鲜,但是只是浅尝辄止,没有做过多的探索,最近恰好有点时间&…