MySQL 架构

本篇主要介绍一下MySQL的架构

目录

一、整体架构

二、连接层

网络端口

连接管理线程 

三、服务层

NoSQL接口与SQL接口

Parser(语法分析器)

 Optimizer(查询优化器)

Cache & Buffers(缓存)

四、存储引擎层 


一、整体架构

MySQL的整体架构如下图所示:

下面我们来简单了解一下该图中各部分的含义:

  • MySQL Connectors :指的是MySQL为各编程语言提供的访问接口,例如,JDBC,通过这些接口就能直接在编写的程序里访问MySQL。
  •  MySQL Shell : 是一个较为高级的MySQL客户端和代码编辑器,需要单独安装才能使用,除了具有MySQL客户端的功能之外还具有能够被JS语言,python语言调用访问的接口。通常情况下,MySQL Shell提供给数据库开发人员使用。
  • 连接层:对来自客户端的连接进行权限验证并将相关的连接信息维护到连接池中,以便于下次连接。
  • 服务管理和公共组件:提供了数据备份与恢复,安全组件,主从复制和集群管理、表分区等相关功能。
  • 服务层:提供NoSQL,SQL的API,SQL解析,SQL语句优化,SQL语句缓存等相关组件。
  • 存储引擎层:提供了一系列可插拔的存储引擎,我们可以通过存储引擎来进行数据的写入与读取,通过存储引擎,我们可以真正的与硬盘中的数据和日志进行交互我们可以根据需求来选择合适的存储引擎进行使用。
  • 文件系统层:该层包含了具体的日志文件和数据文件以及MySQL相关的程序。

下面我们具体来了解一下该架构中的连接层,服务层和存储引擎层。

二、连接层

MySQL的连接层主要处理客户端与服务器的连接。

网络端口

在MySQL服务器中,可以开放多个端口来监听来自客户端的连接,但默认只使用3306进行监听,如果需要开启多个端口来监听,可以通过配置文件来设置,具体如下:

[mysqld] #服务器节点

port=3306 #监听端口1

port=3307 #监听端口2

连接管理线程 

对于端口监听到的连接请求通过连接管理线程来处理,但针对不同的平台,连接管理线程的使用略有不同,具体如下:

  • 在所有平台上,mysql都会创建一个连接管理线程来处理所有TCP/IP请求。
  • 在unix平台上,这个连接管理线程则还能够用来 处理unix socket的连接请求。
  • 在windows上,则会创建一个连接管理线程来处理Shared - memeory的连接请求,创建另一个连接管理线程来处理Named-pipe方式的连接请求
  • 在所有平台上,都能额外开启一个端口单独用作TCP/IP请求的监听,然后使用前面说的处理所有TCP/IP请求的连接管理线程来处理这个端口上的请求,也可以通过配置文件,单独创建一个连接管理线程来处理这些连接请求。

下面我们来了解一下连接管理线程的工作流程:

连接管理线程在处理连接请求时会将请求一对一的转发给执行线程,由该执行线程来处理具体的的身份验证和处理连接请求。执行线程通过线程池进行管理,线程池会事先创建好执行线程并缓存,当有请求转发过来时,会先去该线程池中寻找是否有能够使用的执行线程,如果没有则创建一个 ,当该新建的执行线程处理完成请求后,会去看线程池是否还有空间,如果有则把该线程放入线程池,如果没有则销毁,使用线程池主要是提高线程的复用并减少创建线程所带来的开销以提高性能。

对于上面提到的线程池,我们可以通过一些系统变量来查看或设置与其相关的参数,具体如下:

thread_cache_size :线程池中缓存的大小,决定了能包含多少执行线程

thread_stack: 执行线程的堆栈大小,用来防止执行线程因递归太深等原因分配过多的内存用作栈空间

threads_cached:缓存中的线程数

threads_created : 超出线程池缓存,新创建的执行线程的数量

 在MySQL中存在最大的允许同一时间连接的客户端数,该数通过系统变量max_connections来设置,如果连接数超过该值,则会拒绝所有的连接,并增加状态变量Connection_errors_max_connection的值,但也有例外,如果当前的连接请求是由具有管理员权限的用户发起的,则不会拒绝该连接请求,因此mysqld实际上是允许max_connections+1个客户端同时建立连接的。需要注意的是,在主从复制的环境中,从节点的连接也会被计入max_connections.max_connections的设定应该参照当前硬件环境的性能。

三、服务层

数据库服务层是mysqld的核心部分,下面我们来具体了解一下他各部分内容:

NoSQL接口与SQL接口

该部分主要用来接收和来自客户端的SQL语句,然后将语句转发给服务层的其它部分进行处理,最后再将 处理结果返回给客户端。

Parser(语法分析器)

语法分析的功能主要是将SQL中的关键字和用户定义的字段提取出来并分析,最终形成一棵解析树,分析的过程包括词法分析和语法分析,词法分析,主要是对关键字进行提取,比如“delete,create,select.....”。语法分析主要是分析SQL中是否有语法错误,也就是我们常见的ERROR1064 (42000):You have an error in your SQL syntax。

例如下面这条SQL

select sn, name from student where id = 1;

可以转换成如下解析树:

 Optimizer(查询优化器)

通过词法分析器处理过后的语句将会交由查询优化器进行优化,查询优化器会根据前面生成的解析树生成一系列执行计划,然后根据查执行计划匹配索引,最终找到一条性能最好的执行计划,然后将该执行计划的SQL交给执行器,执行器就会调用存储引擎提供的api来真正执行该SQL。

Cache & Buffers(缓存)

MySQL的缓存主要用来提高查询语句的性能,当客户端传来一条查询的SQL时,会先去缓存中查是否存在该SQL,缓存中,SQL与SQL的执行结果通过key-value的方式进行组织,存在直接返回对应的value。如果不存在,则继续通过前面的词法分析器,查询优化器,以正常的流程执行该SQL。需要注意的是,如果缓存中的value中记录的数据发生了更改,也就是说当前该语句的执行结果已经变化了,则会删除这条缓存,因此在写多读少的情况下,命中缓存(使用缓存)的几率就会很低,而缓存的创建和修改操作则会十分频繁,从而浪费大量的性能,因此在MySQL8.0之后的版本,服务层的缓存已经被官方删除了,不再使用。

最后我们通过下图来具体看一下一条SQL在MySQL服务层的执行过程:

四、存储引擎层 

存储引擎层用来具体完成SQL语句的执行以及与文件系统的交互,里面包含了一系列可插拔的存储引擎组件,用来处理并执行对应表类型的SQL,这些存储引擎组件,可以在MySQL运行时进行动态的加载和卸载。通过下面这条SQL,我们能够查看到当前MySQL支持哪些存储引擎:

show engines;

 其中,NO表示支持,Yes表示不支持,default表示当前服务器在创建表时默认使用该存储引擎。有关这些存储引擎的特点和详细内容将在下一篇博客中介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI实时免费在线图片工具5:Glyph-ByT5图上添加文字显示

1、Glyph-ByT5图上添加文字显示(支持多语言:中文、英文、韩文等) 参考:https://github.com/AIGText/Glyph-ByT5 在线网址: https://huggingface.co/spaces/GlyphByT5/Glyph-SDXL-v2 下面是画框,一个框要点…

如何定位报错: indexSelectLargeIndex:... Assertion `srcIndex < srcSelectDimSize` fail

文章目录 1. 背景2. 准备工作2.1 debug工具2.2 设置准备工作 3. 开启 debug 1. 背景 在使用 cuda 在 gpu 计算的过程中&#xff0c;出现索引超过最大长度。 indexSelectLargeIndex:... Assertion srcIndex < srcSelectDimSize fail通常这种时候堆栈底部还伴随以下报错&…

Aiflow中,代码逻辑中明明不该触发的方法但是却触发了。

图中这个红圈的task&#xff0c;是我更新error记录的task&#xff0c;是某些特定的task特定情况会触发的。正常情况走的最下面的箭头的路径。但是现在就是就算只走了下面箭头的路径&#xff0c;红圈那个task依然被触发了。检查了半天才发现&#xff0c;它的TriggerRule设置的是…

【HarmonyOS】鸿蒙应用模块化实现

【HarmonyOS】鸿蒙应用模块化实现 一、Module的概念 Module是HarmonyOS应用的基本功能单元&#xff0c;包含了源代码、资源文件、第三方库及应用清单文件&#xff0c;每一个Module都可以独立进行编译和运行。一个HarmonyOS应用通常会包含一个或多个Module&#xff0c;因此&am…

第55期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

CIC-DDoS2019-Detection

CIC-DDoS2019 对CIC-DDoS2019数据集进行检测,本文提供了如下内容&#xff1a; 数据清洗与合并机器学习模型深度学习模型PCA,t-SNE分析数据&#xff0c;结果可视化 代码地址&#xff1a;[daetz-coder](https://github.com/daetz-coder/CIC-DDoS2019-Detection) 1、数据集加载…

【Anaconda】【Windows编程技术】【Python】Anaconda的常用命令及实操

一、Anaconda终端 在安装Anaconda后&#xff0c;电脑上会新增一个Anaconda终端&#xff0c;叫Anaconda Prompt&#xff0c;如下图&#xff1a; 我们选择“打开文件位置”&#xff0c;将快捷方式复制一份到桌面上&#xff0c;这样日后就可以从桌面上方便地访问Anaconda终端了&…

欢乐钓鱼大师游戏攻略:萌新必备攻略大全!钓鱼脚本!

《欢乐钓鱼大师》是一款休闲益智类游戏&#xff0c;以钓鱼为主题&#xff0c;玩家需要通过各种钓鱼任务和挑战&#xff0c;收集不同种类的鱼类&#xff0c;并提升自己的钓鱼技术和装备。本文将为大家详细解析游戏的各个方面&#xff0c;帮助玩家更好地掌握游戏技巧&#xff0c;…

Airbind - hackmyvm

简介 靶机名称&#xff1a;Airbind 难度&#xff1a;中等 靶场地址&#xff1a;https://hackmyvm.eu/machines/machine.php?vmAirbind 本地环境 虚拟机&#xff1a;vitual box 靶场IP&#xff08;Airbind&#xff09;&#xff1a;192.168.56.121 跳板机IP(windows 11)&…

BEV 中 multi-frame fusion 多侦融合(一)

文章目录 参数设置align_dynamic_thing:为了将动态物体的点云数据从上一帧对齐到当前帧流程旋转函数平移公式filter_points_in_ego:筛选出属于特定实例的点get_intermediate_frame_info: 函数用于获取中间帧的信息,包括点云数据、传感器校准信息、自车姿态、边界框及其对应…

半监督医学图像分割:基于对抗一致性学习和动态卷积网络的方法| 文献速递-深度学习结合医疗影像疾病诊断与病灶分割

Title 题目 Semi-Supervised Medical Image Segmentation Using Adversarial Consistency Learning and Dynamic Convolution Network 半监督医学图像分割&#xff1a;基于对抗一致性学习和动态卷积网络的方法 01 文献速递介绍 医学图像分割在计算辅助诊断和治疗研究中扮演…

移动app必须进行安全测试吗?包括哪些测试内容?

移动App已经成为我们日常生活中不可或缺的一部分&#xff0c;无论是社交娱乐还是工作学习&#xff0c;我们都离不开这些精心设计的应用程序。然而&#xff0c;随着移动App的广泛普及和使用&#xff0c;其安全性问题也逐渐浮出水面。为了确保用户数据的安全和减少潜在的风险&…

Playwright工作原理

执行test时&#xff0c;有哪些关键步骤 当我们用Playwright编写一段简单的test script&#xff0c;代码如下所示&#xff1a;在test case中第一段代码就是await page.goto(xxxxx) import { test, expect } from playwright/test;test(test, async ({ page }) > {await page…

新闻稿发布中被拒稿的原因分析

企业的公关经理在落地新闻宣传时一定碰到过新闻媒体拒稿的情况&#xff0c;小马识途在此总结了常见的拒稿原因&#xff0c;供广大企业参考。 1、新闻稿内容涉及违法违规信息 企业在发稿的时候内容一定要确认好&#xff0c;不要涉及违法、违规类信息&#xff0c;如果新闻内容里…

序列到序列模型中的注意力机制

目录 一、说明 二、编码器解码器架构中的问题&#xff1a;需要注意 2.1 编码器方面的问题&#xff1a; 2.2 解码器方面的问题&#xff1a; 三、什么是注意力机制&#xff1f; 3.1 计算 ci 值&#xff1a; 3.2 ci 的广义表示&#xff1a; 四、Bahdanau 注意 &#xff1a; 4.1. 兼…

报表开发工具DevExpress Reporting v23.2 - 增强PDF导出、多平台打印等

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reporting控件日前正式发布了v23.2…

生产看板管理系统内容有哪些?

相信很多做生产管理的朋友都会遇到如下问题&#xff0c;我就在想&#xff0c;是否能一个创建“透明的”的工作场所&#xff1f;让员工和管理者能够实时查询生产进度&#xff0c;及时发现生产中的问题。 生产进度难追踪 生产过程不透明 生产决策缺乏数据支持 ——能&#xf…

LeRobot——Hugging Face打造的机器人领域的Transformer架构

前言 如友人邓博士所说&#xff0c;“用 Stanford aloha 课题组提供的训练数据&#xff0c;训练他们研发的 Action Chunking Transformer 动作规划模型&#xff0c;训练结果&#xff0c;能用&#xff0c;但是稳定性有待提高 要提高稳定性&#xff0c;看来必须修改 Stanford a…

C++初学者指南第一步---6.枚举和枚举类

C初学者指南第一步—6.枚举和枚举类 文章目录 C初学者指南第一步---6.枚举和枚举类1.作用域的枚举(enum class类型&#xff09;&#xff08;C11&#xff09;2.无作用域的枚举(enum类型)3.枚举类的基础类型4.自定义枚举类映射5.和基础类型的互相转换 1.作用域的枚举(enum class类…

深度学习(九)——神经网络:最大池化的作用

一、 torch.nn中Pool layers的介绍 官网链接&#xff1a; https://pytorch.org/docs/stable/nn.html#pooling-layers 1. nn.MaxPool2d介绍 nn.MaxPool2d是在进行图像处理时&#xff0c;Pool layers最常用的函数 官方文档&#xff1a;MaxPool2d — PyTorch 2.0 documentation &…