深度好文:MySQL体系结构

MySQL采用的是客户/服务器体系结构,实际是有两个程序,一个是MySQL服务器程序,指的是mysqld程序,运行在存放数据库的机器上,负责在网络上监听并处理来自客户的服务请求,根据这些请求去访问数据库的内容,再把信息回传给客户;另一个程序时MySQL客户程序,负责连接到数据库服务器,并通过向服务器发出查询命令来告知服务器需要哪些信息

MySQL总体结构分为四层

总体结构

<!-- more -->

组件说明

连接层
Connectors

指的是不同语言中与SQL的交互

服务层
Management Serveices & Utilities

系统管理和控制工具

Connection Pool

连接池,管理缓冲用户连接,线程处理等需要缓存的需求。 负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。

而连接线程的主要工作就是负责 MySQL Server 与客户端的通信,接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。

SQL Interface

接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface

Parser

解析器,SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。

在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query ,在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。
主要功能:

  • 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
  • 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
Optimizer

查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求的 query(sql语句) ,根据客户端请求的 query 语句,区分出是select语句转发给Optimizer,优化处理掉一些常量表达式的预算,直接转换为常量值。并对Query中的查询条件进行简化和转换,如去掉一些无用或者显而易见的条件,结构调整等,然后分析Query中的Hint信息,看显示Hint信息是否可以完全确定该Query的执行计划,如果没有Hint或者Hint信息还不足以完全确定执行计划,则会读取所涉及对象的统计信息,根据Query进行写相应的计算分析,然后得出最后的执行计划。

他使用的是“选取-投影-联接”策略进行查询。

   用一个例子就可以理解: select uid,name from user where gender = 1;
   这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤
   这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤
   将这两个查询条件联接起来生成最终查询结果
Cache和Buffer

查询缓存,主要功能是将客户端提交给MySQL的 Select类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做一个对应。该 Query 所取数据的基表发生任何数据的变化之后,MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

buffer是写缓存,cache是读缓存
插件式存储引擎层Engine

存储引擎接口模块,MySQL区别于其他数据库的最重要的特点就是其插件式的表存储引擎。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如SQL分析器和优化器等,而存储引擎是底层物理结构的实现,每个存储引擎开发者都可以按照自己的意愿来进行开发。

存储引擎是基于表的,而不是数据库。

交互过程

程序的请求通过mysql的connectors与其进行交互,请求会进入连接池(Connection Pool)中并交给管理器(Management Serveices & Utilities)管理,当该请求从等待队列进入到处理队列,管理器会将请求丢给SQL接口(SQL Interface),SQL接口接收到请求后,会将请求进行hash处理并与缓存中的结果进行对比,如果完全匹配则通过缓存直接返回处理结果;否则将由SQL接口传给解释器(Parser),解释器会判断SQL语句是否正确,如果正确则将SQL语句转化为数据结构,解释器处理完,则将数据结构传给优化器(Optimizer),优化器会产生多种执行计划,会根据该sql所涉及到的数据表的相关统计信息进行计算分析(这个统计数据是使用ANALYZE table 表名命令通知mysql对表的相关数据做分析之后所获得的一些数据统计量),最终数据库会选择最优的方案将SQL语句交给存储引擎(Engine)处理,存储引擎将会到后端的存储设备中取得相应的数据,并返回给程序

MySQL查询过程

体系结构图

 

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

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

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

相关文章

插件和工具汇总

插件和工具汇总 【一】MyBatis Log插件【二】热部署&#xff08;1&#xff09;适用于IntelliJ IDEA 2021.X以上版本&#xff08;2&#xff09;适用于IntelliJ IDEA 2021.X以下版本 【三】一些快捷键 【一】MyBatis Log插件 能够自动拼接参数生成执行的SQL语句&#xff0c;可以…

073:vue+mapbox 加载here地图(影像瓦片图 v3版)

第073个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载here地图的影像瓦片图。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共77行)相关API参考:专栏目标示例效果

docker:环境安装

系列文章目录 docker&#xff1a;环境安装 文章目录 系列文章目录前言一、Debian安装1.镜像下载2.VM安装3.Debian安装 二、docker安装1.Debian12换源2.docker安装3.docker测试4.docker换源 总结 前言 因为CentOS7确定停服时间为6月30日&#xff0c;虽然对我这种小虾米没啥影响…

ML:2-2-1 Tensorflow

文章目录 1. Tensorflow实现2. 模型训练细节2.1 定义模型f(x)2.2 找到loss and cost funciton2.3 Gradient descent 【吴恩达p60-61】 1. Tensorflow实现 继续看手写数字识别的例题第一步&#xff0c;我们上周学习了。第二步&#xff0c;让Tensorflow去编译模型。最重要的一步…

游戏素材永不缺,免费在线AI工具Scenario功能齐全,简单易用

Scenario是一个在线的AI驱动的工具&#xff0c;主要用于游戏艺术创作。它提供了一套全面的功能&#xff0c;旨在帮助游戏开发者创建与其独特风格和艺术方向相符的独特、高质量的游戏艺术。Scenario的突出特点之一是它的微调能力&#xff0c;允许用户根据独特的风格和艺术方向训…

Vue-23、Vue收集表单数据

1、效果 2、代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>收集表单数据</title><script type"text/javascript" src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js…

Rust-Panic

什么是panic 在Rust中&#xff0c;有一类错误叫作panic。示例如下&#xff1a; 编译&#xff0c;没有错误&#xff0c;执行这段程序&#xff0c;输出为&#xff1a; 这种情况就引发了一个panic。在这段代码中&#xff0c;我们调用了Option::unwrap()方法&#xff0c;正是这个方…

小程序微信支付

微信支付介绍 支付大家应该都不陌生了&#xff0c;在现实生活中经常购买商品并且使用支付功能来付款&#xff0c;在付款的时候可能使用比较多的就是微信支付和支付宝支付了。在苍穹外卖项目中&#xff0c;选择的就是微信支付这种支付方式。 要实现微信支付就需要注册微信支付的…

Midjourney的注册、订阅

一、Midjourney是什么 MJ 就是一个人工智能绘图平台。它于2022年7月12日首次进行公测&#xff0c;2023年3月14日发布的 V5 版本&#xff0c;该版本较之前有了显著提升&#xff0c;生成图片分辨率更高&#xff0c;写实风格人物主体塑形更加准确&#xff0c;细节更多且审美在线。…

光伏逆变器数据采集方案

1 背景 分布式光伏电站主要建设在建筑屋面&#xff0c;厂房屋顶之上&#xff0c;电站后期的运维工作有诸多不便。运用光伏数据采集技术&#xff0c;对配套设备的数据进行远程采集&#xff0c;实现无人值守&#xff0c;可以降低运维成本&#xff0c;有效提高发电效率&#xff0…

Linux学习记录——사십삼 高级IO(4)--- Epoll型服务器(1)

文章目录 1、理解Epoll和对应接口2、简单实现 1、理解Epoll和对应接口 poll依然需要OS去遍历所有fd。一个进程去多个特定的文件中等待&#xff0c;只要有一个就绪&#xff0c;就使用select/poll系统调用&#xff0c;让操作系统把所有文件遍历一遍&#xff0c;哪些就绪就加上哪…

计算机网络-NAT网络地址转换

今天来回顾下之前所学的知识&#xff0c;将它们串联起来进行巩固。一开始了解了IP编址进行IP设置和划分网段&#xff1b;学习了二层以太网交换&#xff0c;了解了二层通信基础&#xff1b;学习了路由基础知识&#xff0c;大致了解到了路由是什么&#xff1f;静态路由和动态路由…

【QT】多窗体应用程序设计

目录 1主要的窗体类及其用途 2 窗体类重要特性的设置 2.1 setAttribute()函数 2.2 setWindowFlags()函数 2.3 setWindowState()函数 2.4 setWindowModality()函数 2.5 setWindowOpacity()函数 3 多窗口应用程序的设计 3.1 主窗口设计 3.2 QFormDoc类的设计 3.3 QFormDoc类的使用…

【Python_PySide6学习笔记(三十一)】基于PySide6实现自定义串口设备连接界面类:可实现串口连接断开、定时发送等功能

基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能 基于PySide6实现自定义串口设备连接界面类:可实现串口连接关闭、定时发送等功能前言一、界面布局二、串口相关功能实现三、完整代码四、调用方法五、实现效果基于PySide6实现自定义串口设备连接…

入门指南:使用STM32微控制器进行ADC数据采集

使用STM32微控制器进行ADC&#xff08;模数转换器&#xff09;数据采集是嵌入式系统开发中常见的任务。本文将介绍如何通过STM32CubeMX和HAL库函数进行ADC数据采集&#xff0c;并提供相应的代码示例。 1. STM32CubeMX配置 首先&#xff0c;使用STM32CubeMX工具配置STM32微控制…

纸黄金实战投资技巧:避免亏损的有效策略

在纸黄金交易的实战中&#xff0c;避免亏损是每位投资者都追求的目标。虽然任何投资都存在一定的风险&#xff0c;但采取一些有效的策略可以帮助投资者最大限度地减少亏损的可能性。以下是一些在纸黄金交易中避免亏损的实战技巧&#xff1a; 一、设定止损点是避免亏损的关键 止…

【Java封装Jar包】将自己的代码封装为一个jar包⭐️以便在别的项目可以直接引用使用

哎&#xff0c;有了&#xff0c;搞一个Jar包给你&#xff01; 目录 前言 一、新建一个Java项目&#xff0c;样例为新建一个Springboot项目&#xff0c;引入了下面两个依赖 二、新建一个测试工具类 三、封装为Jar包 四、项目引入Jar包 五、测试下Jar包 小伙伴们大家好&…

接口测试需求分析

测试接口的时候&#xff0c;可能很多人都会想&#xff0c;按着研发给的接口协议文档来测&#xff0c;不就好了吗&#xff1f; 其实&#xff0c;对于接口的测试&#xff0c;还需要有点深度的需求分析&#xff0c;然后再进行对应的测试。对于接口测试&#xff0c;这里有个不太详…

数字电源简介

数字电源简介 定义主要应用场景数字电源的基本组成常见算法常见电源拓扑PFCLLC 数字电源与模拟电源对比参考链接 定义 常见定义有以下四种&#xff1a; 通过数字接口控制的开关电源&#xff0c;强调的是数字电源的“通信”功能。可通过I2C或类似的数字总线来对数字信号进行控…

MongoDB-数据库文档操作(2)

任务描述 文档数据在 MongoDB 中的查询和删除。 相关知识 本文将教你掌握&#xff1a; 查询文档命令&#xff1b;删除文档命令。 查询文档 我们先插入文档到集合 stu1 &#xff1a; document([{ name:张小华, sex:男, age:20, phone:12356986594, hobbies:[打篮球,踢足球…
最新文章