mysql 笔记(一)-mysql的架构原理

news2024/11/25 22:56:33

mysql体系结构

mysql Server 架构自顶向下大致可以分为网络连接层,服务层,存储引擎和系统文件层.体系架构图如下:
在这里插入图片描述
网络连接层提供与mysql服务器建立的支持.常见的java.c.python/.net ,它们通过各自API技术与mysql建立连接.

服务层是Mysql Server 的核心,主要包含系统管理和控制工具,连接池,SQL连接,解析器,查询优化器和缓存六部分.

存储引擎负责MySQL中数据的存储与提取,与底层系统文件进行交互.MySQL 存储引擎是插件式的,服务器中的查询执行引擎通过接口与存储引擎进行通信,接口屏蔽了不同存储引擎之间的差异.最常见的存储引擎是MYISAM和InnoDB.

系统文件层负责数据库的数据和日志存储在文件系统上, 并完成与存储引擎的交互,是文件的物理存储层, 主要包含日志文件,数据文件,配置文件.pid文件.socket文件等.

mysql的运行机制

mysql的逻辑架构如下:
在这里插入图片描述
MYSQL 可以分为server层和存储引擎层, Server层包括连接器、查询缓存、分析器、优化器、执行器,包括大多数Mysql 中的核心功能, 所有跨存储引擎的功能也在这一层实现,包括存储过程、触发器、视图等。

存储引擎层包括Mysql 常见的存储引擎,包括MyISAM、InnoDB的鞥,最常用的是InnoDB,也是mysql5.5 以后的默认存储引擎。

mysql执行过程如下图
在这里插入图片描述

连接器
通过客户端/服务端通信协议与Mysql 建立连接,需要一个连接器来连接用户和Mysql 数据库。MySQL客户端与服务端的通信方式是"半双工". 对于每个MYSQL连接,时刻都有一个线程状态来标识这个连接正在做什么.

可以通过"show processlist" 查看用户正在运行的线程信息,root用户能查看所有线程,其他用户只鞥能自己的;
在这里插入图片描述
id: 线程ID,可以使用kill xx;
user: 启动这个线程的用户;
Host:发送请求的客户端的IP 和端口号
db: 当前命令在哪里库执行;
command: 该线程正在执行的操作命令
(1) Create DB:正在创建库操作;
(2) Drop DB:正在删除库操作;
(3)Execute:正在执行一个PreparedStatement
(4)Close Stmt:正在关闭一个PreparedStatement
(5)Query:正在执行一个语句
(6)Sleep:正在等待客户端发送语句
(7)Quit:正在退出
(8)Shutdown:正在关闭服务器

time: 表示该线程处于当前状态的时间,单位是秒;
State:线程状态
(1)Updating:正在搜索匹配记录,进行修改;
(2)Sleeping:正在等待客户端发送新请求;
(3)Starting:正在执行请求处理;
(4)Checking table:正在检查数据表;
(5)Closing table : 正在将表中数据刷新到磁盘中;
(6)Locked:被其他查询锁住了记录;
(7)Sending Data:正在处理Select查询,同时将结果发送给客户端;
Info:一般记录线程执行的语句,默认显示前100个字符。想查看完整的使用show full
processlist;

查询缓存
查询缓存(Cache&Buffer),这是MySQL的一个可优化查询的地方,如果开启了查询缓存且在查询缓存过程中查询到完全相同的SQL语句,则将查询结果直接返回给客户端;如果没有开启查询缓存或者没有查询到完全相同的 SQL 语句则会由解析器进行语法语义解析,并生成“解析树”。
执行Select查询时,先查询缓存,判断是否存在可用的记录集,要求是否完全相同(包括参数值),这样才会匹配缓存数据命中;即使开启查询缓存,以下SQL也不能缓存:
(1)查询语句使用SQL_NO_CACHE;
(2)查询的结果大于query_cache_limit设置;
(3)查询中有一些不确定的参数,比如now();

show variables like ‘%query_cache%’; //查看查询缓存是否启用,空间大小,限制等;
show status like ‘Qcache%’; //查看更详细的缓存参数,可用缓存空间,缓存块,缓存多少等;

在mysql8 之后,查询缓存就被移除的,移除的原因主要有以下三点:
1.查询缓存的效果取决于缓存的命中率,只有命中缓存的查询效果才能有改善,因此无法预测其性能。
2.查询缓存的另一个大问题是它受到单个互斥锁的保护。在具有多个内核的服务器上,大量查询会导致大量的互斥锁争用。
3.研究表明,缓存越靠近客户端,获得的好处越大。

解析器
解析器(Parser)将客户端发送的SQL进行语法解析,生成"解析树"。预处理器根据一些MySQL
规则进一步检查“解析树”是否合法,例如这里将检查数据表和数据列是否存在,还会解析名字和别
名,看看它们是否有歧义,最后生成新的“解析树”。

查询优化器
查询优化器(Optimizer)根据“解析树”生成最优的执行计划。MySQL使用很多优化策略生成最
优的执行计划,可以分为两类:静态优化(编译时优化)、动态优化(运行时优化)。

  • 等价变换策略
    • 5=5 and a>5 改成 a > 5
    • a < b and a=5 改成b>5 and a=5
    • 基于联合索引,调整条件位置等
  • 优化count、min、max等函数
    • InnoDB引擎min函数只需要找索引最左边
    • InnoDB引擎max函数只需要找索引最右边
    • MyISAM引擎count(*),不需要计算,直接返回
  • 提前终止查询
    • 使用了limit查询,获取limit所需的数据,就不在继续遍历后面数据
  • in的优化
    • MySQL对in查询,会先进行排序,再采用二分法查找数据。比如where id in (2,1,3),变成 in (1,2,3)

查询执行引擎
查询执行引擎负责执行 SQL 语句,此时查询执行引擎会根据 SQL 语句中表的存储引擎类型,以及对应的API接口与底层存储引擎缓存或者物理文件的交互,得到查询结果并返回给客户端。若开启用查询缓存,这时会将SQL 语句和结果完整地保存到查询缓存(Cache&Buffer)中,以后若有相同的 SQL 语句执行则直接返回结果。如果开启了查询缓存,先将查询结果做缓存操作;如果返回结果过多,采用增量模式返回.

当执行一条查询的SQL的时候,大概发生以下步骤:
1.客户端发送查询语句给服务器;
2.服务器首先检查缓存中是否存在该查询,若存在,返回缓存中的结果,若不存在就进行下一步。(Mysql8 后没有这一步);
3.服务器进行SQL的解析、语法检测和预处理,再由优化器生成对应的执行计划;
4.Mysql 的执行器根据优化器生成的执行计划执行,调用存储引擎的接口进行查询;
5.服务器将查询的结果返回客户端;

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

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

相关文章

linux Ubuntu 更新镜像源、安装sudo、nvtop、tmux

1.更换镜像源 vi ~/.pip/pip.conf在打开的文件中输入: pip.conf [global] index-url https://pypi.tuna.tsinghua.edu.cn/simple按下:wq保存并退出。 2.安装nvtop 如果输入指令apt install nvtop报错&#xff1a; E: Unable to locate package nvtop 需要更新一下apt&a…

容灾备份服务器怎么样?

容灾备份服务器是一种用于保护信息系统的设备&#xff0c;它可以在系统出现故障时提供备用服务。容灾备份服务器通常包括两个部分&#xff1a;容灾和备份。容灾是指在遭遇灾害时能保证信息系统能正常运行&#xff0c;帮助企业实现业务连续性的目标。备份是为了应对灾难来临时造…

MemFire教程|FastAPI+MemFire Cloud+LangChain开发ChatGPT应用-Part2

基本介绍 上篇文章我们讲解了使用FastAPIMemFire CloudLangChain进行GPT知识库开发的基本原理和关键路径的代码实现。目前完整的实现代码已经上传到了github&#xff0c;感兴趣的可以自己玩一下&#xff1a; https://github.com/MemFire-Cloud/memfirecloud-qa 目前代码主要…

了解JavaSpring

什么是Spring&#xff1f; Spring开发方向&#xff1a;分布式&#xff0c;微服务&#xff0c;网站 Spring技术&#xff08;全家桶&#xff09;&#xff1a;Spring Framework、Spring boot、Spring Cloud Spring Framework&#xff08;4.x&#xff09; 是spring体系中最基础…

盛元广通基于信息平台的医学实验室综合管理系统

医学实验室的飞速发展&#xff0c;为医学科研、突发传染病防治、服务基层医疗等方面提供了有效助力&#xff0c;实验室注重实际应用的研究和实际问题的解决&#xff0c;实验室管理能力也在逐步迈向一个新的台阶&#xff0c;利用信息化技术手段实现对实验室开放共享的有效管理&a…

【Spring Boot】拦截器与统一功能处理

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE进阶 上一篇文章我们讲解了Spring AOP是一个基于面向切面编程的框架&#xff0c;用于将某方面具体问题集中处理&#xff0c;通过代理对象来进行传递&#xff0c;但使用原生Spring AOP实现统一的…

搭建本地开发服务器

搭建本地开发服务器 :::warning 注意 在上一个案例的基础上添加本地开发服务器&#xff0c;请保留上个案例的代码。如需要请查看 Webpack 使用。 ::: 搭建本地开发服务器这一个环节是非常有必要的&#xff0c;我们不可能每次修改源代码就重新打包一次。这样的操作是不是太繁琐…

linux文本三剑客---grep,sed,awk

目录 grep 什么是grep&#xff1f; grep实例演示 命令参数&#xff1a; 案例演示&#xff1a; sed 概念&#xff1a; 常用选项&#xff1a; 案例演示&#xff1a; awk 概念&#xff1a; awk常用命令选项&#xff1a; awk变量&#xff1a; 内置变量 自定义变量 a…

代理模式(C++)

定义 为其他对象提供一种代理以控制(隔离&#xff0c;使用接口)对这个对象的访问。。 应用场景 在面向对象系统中&#xff0c;有些对象由于某种原因(比如对象创建的开销很大&#xff0c;或者某些操作需要安全控制&#xff0c;或者需要进程外的访问等)直接访问会给使用者、或…

出现Error: Cannot find module ‘compression-webpack-plugin‘错误

错误&#xff1a; 解决&#xff1a;npm install --save-dev compression-webpack-plugin1.1.12 版本问题

十、ESP32控制1.54寸240x240彩屏幕(SPI)

1. 运行效果 2. 240x240屏幕介绍 有8个引脚,说明如下 通过SPI协议进行传送数据,用到的芯片是S

ubuntu20.04 docker 下编译 tensorflow-gpu

ubuntu20.04 安装tensorflow-gpu 配置&#xff1a; 系统 ubuntu 20.04 LTS 显卡 GTX 1060 6G 1 安装cudatoolkit &#xff08;我选 CUDA Toolkit 12.2 &#xff09; NVIDIA CUDA Installation Guide for Linux https://docs.nvidia.com/cuda/cuda-installation-guide-linux/in…

数据结构-1

1.2 线性结构树状结构网状结构&#xff08;表 数 图&#xff09; 数据&#xff1a;数值型 非数值型 1.2.3数据类型和抽象数据类型 1.3抽象数据类型 概念小结&#xff1a; 线性表: 如果在独立函数实现的 .c 文件中需要包含 stdlib.h 头文件&#xff0c;而主函数也需要包含 st…

(统计学习方法|李航)第一章统计学习方法概论七八九十节——生成模型与判别模型,分类问题,标注问题,回归问题

目录 一&#xff0c;生成模型与判别模型 二&#xff0c;分类问题 三&#xff0c;标注问题 四&#xff0c;回归问题 一&#xff0c;生成模型与判别模型 P&#xff08;X,Y&#xff09;是联合概率分布 只要是出现联合概率分布&#xff0c;就一定是生成模型 判别方法就是直接去…

【owt】erzio的handler和pipeline

【owt】erzio的PipelineBase::addService licode学习之erizo篇–Pipeline_handle 大神分析的非常细致: 大神 总结:erizo的pipeline的handler是负责实际数据处理的,通过处理链路,将之串联起来 大神还绘制了基础类图: pipleline 负责读写数据包并处理数据包 创建:static Pt…

.Net Core工作流WorkFlowCore

WorkFlowCore是一个针对.NetCore的轻量级的工作流引擎&#xff0c;提供了FluentAPI、多任务、持久化以及并行处理的功能&#xff0c;适合于小型工作流、责任链的需求开发。支持工作流长期运行&#xff0c;提供了各种持久化方式。 本篇开发环境为.Net7&#xff0c;此处不演示Js…

代码调试3:coco数据集生成退化图

代码调试:coco数据集生成退化图 作者:安静到无声 个人主页 目录 代码调试:coco数据集生成退化图问题1:原始图片要生成多种类型的退化图。问题2:输入尺寸的匹配问题。问题3:如何将缩放后的图片恢复到原始尺寸?遇到灰色图片怎么办。问题4:如何设计出端到端的的程序问题5…

uni-app离线打包高德地图导入android studio不能正常显示

本人使用的uni-app SDK版本&#xff1a;Android-SDK3.8.7.81902_20230704 1.导入以上文件&#xff0c;依赖已经自动添加了 2.确保这个正常引入 3.修改AndroidMainifest.xml,添加自己的密钥

使用gpt对对话数据进行扩增,对话数据扩增,数据增强

我们知道一个问题可以使用很多方式问&#xff0c;但都可以使用完全一样的回答&#xff0c;基于这个思路&#xff0c;我们可以很快的扩增我们的数据集。思路就是使用chatgpt或者gpt4生成类似问题&#xff0c;如下&#xff1a; 然后我们可以工程化这个过程&#xff0c;从而快速扩…

python -- 如何将nc数据中的时间转换为北京时区的时间

在nc数据处理时&#xff0c;以ERA5的小时数据为例&#xff0c;使用的时间为UTC&#xff0c;不同时区存在时间上的差异&#xff0c;如何将其转化为北京当地的时间呢? https://confluence.ecmwf.int/display/CKB/ERA5%3Adatadocumentation #!/usr/bin/env python3 # -*- cod…