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.hqwc.cn/news/140107.html

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

相关文章

网络工程师知识点7

111、IS-IS路由器的三种类型? Level-1路由器(只能创建level-1的LSDB) Level-2路由器(只能创建level-2的LSDB) Level-1-2路由器(路由器默认的类型,能同时创建level-1和level-2的LSDB)…

竞赛 深度学习乳腺癌分类

文章目录 1 前言2 前言3 数据集3.1 良性样本3.2 病变样本 4 开发环境5 代码实现5.1 实现流程5.2 部分代码实现5.2.1 导入库5.2.2 图像加载5.2.3 标记5.2.4 分组5.2.5 构建模型训练 6 分析指标6.1 精度,召回率和F1度量6.2 混淆矩阵 7 结果和结论8 最后 1 前言 &…

NFTScan 支持非 EVM 公链的 NFT Collection 的认证功能

截止到 2023 年 10 月份,NFTScan 已经支持了 18 条区块链网络,其中有 14 条 是 EVM 兼容的区块链网络: Ethereum、BNBChain、Polygon、zkSync、Base、Linea、Arbitrum、Optimism、Avalanche、Fantom、PlatON、Cronos、Gnosis、Moonbeam。 另…

线性代数-Python-01:向量的基本运算 -手写Vector -学习numpy的基本用法

文章目录 代码目录结构Vector.py_globals.pymain_vector.pymain_numpy_vector.py 一、创建属于自己的向量1.1 在控制台测试__repr__和__str__方法1.2 创建实例测试代码 二、向量的基本运算2.1 加法2.2 数量乘法2.3 向量运算的基本性质2.4 零向量2.5 向量的长度2.6 单位向量2.7 …

ChatGPT快速入门

ChatGPT快速入门 一、什么是ChatGPT二、ChatGPT底层逻辑2.1 实现原理2.2 IO流程 三、ChatGPT应用场景3.1 知心好友3.2 文案助理3.3 创意助理3.4 角色扮演 一、什么是ChatGPT ChatGPT指的是基于GPT(Generative Pre-trained Transformer)模型的对话生成系…

WordPress 常规设置页面调用媒体中心上传图片插入URL(新版可用)

首先,我们需要在主题或插件文件夹中创建一个 JavaScript 文件(如:media-uploader.js),该文件中包含如下代码。 /*** 媒体中心上传 js **/ jQuery(document).ready(function($){var mediaUploader;$(#upload_image_but…

大数据开发中的秘密武器:探索Hadoop纠删码的奇妙世界

随着大数据技术的发展,HDFS作为Hadoop的核心模块之一得到了广泛的应用。为了系统的可靠性,HDFS通过复制来实现这种机制。但在HDFS中每一份数据都有两个副本,这也使得存储利用率仅为1/3,每TB数据都需要占用3TB的存储空间。因此&…

Python configparser模块使用教程

文章目录 .ini 拓展名文件简介.ini 文件格式1. 节2. 参数3. 注解 configparser 模块简介configparser 模块的初始化和读取获取 ini 中所有 section获取 section 下的 key获取 section 下的 value获取指点section的所用配置信息修改某个key,如果不存在则会出创建检查…

一些bug总结

今天被几个小问题和bug折磨了一天,来总结一下… 权限问题 用vscode连接服务器,如果是在root用户连接的情况下新建的文件/文件夹,然后切换到别的用户的时候去写的代码 可能会遇到各种问题 解决方案是更改文件或文件夹的所有权。这可以通过使用…

【计算机网络】https协议

文章目录 1 :peach:基本概念:peach:1.1 :apple:什么是HTTPS?:apple:1.2 :apple:什么是加密?:apple:1.3 :apple:常见的加密方式:apple:1.3.1 :lemon:对称加密:lemon:1.3.2 :lemon:⾮对称加密:lemon: 1.4 :lemon:数据指纹:lemon: 2 :peach:HTTPS的⼯作过程…

6-3 用链栈实现将非负的十进制数转换为指定的进制数【有题解视频,可本地编译器调试】 分数 15

int DecimalConvert(LinkStack s, int dec, int scale) {while (dec){if (LinkStackPush(s, dec % scale))dec dec / scale;elsereturn 0;}return 1; }

页面路由跳转 - 文件 File对象数据传递

目录 需求主要问题点问题点2.1 演示问题点2.2 演示及解决页面B 处理1 - 有问题页面B 处理2 - 没有问题 - 最终解决办法 【补充】 file 对象转为 base64 文件(即 将 file 对象转为 DataURL) 需求 页面A填写完信息(填写的信息中有上传的文件&am…