MYSQL的基础架构

news2024/10/7 4:25:12

了解MySQL(超详细的MySQL工作原理 体系结构)

在这里插入图片描述
由图,可以看出MySQL最上层是连接组件。下面服务器是由连接池管理工具和服务SQL接口解析器优化器缓存存储引擎文件系统组成。

  • 用户:进行数据库连接的人。

  • 支持接口:是第三方语言提供和数据库连接的接口,常见的有jdbc,odbc,c的标准api函数等等。

  • 管理工具和服务:系统管理和控制工具,例如备份恢复、Mysql复制、集群等(见图)

  • 连接层:提供与用户的连接服务,用于验证登录服务。

—> 连接池:由于每次建立建立需要消耗很多时间,连接池的作用就是将这些连接缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。

  • 服务层:完成大多数的核心服务功能。有sql接口,解析器parser,优化器optimizer,查询缓存 cache/buffer 。

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

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

a.将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。

​ b.如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的。

​ —>优化器:查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。举一个例子:

<span style="color:#000000"><span style="background-color:#282c34"><code class="language-mysql">select * from users where uname='admin';
</code></span></span>

​ 1.这个select查询先根据where语句进行选取,而不是先将表全部查询出来以后再进行uname过滤。(选取

​ 2.这个select查询先根据*进行属性投影,而不是将属性全部取出以后再进行过滤。(投影

​ 3.将这两个查询条件联接起来生成最终查询结果。(联接)

​ —>缓存器: 查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

​ 简而言之, 服务层执行过程:sql语句通过sql接口,服务器如果缓存cache有命中查询结果,直接读取数据。如果没有命中查询结果,由解析器进行sql语句的解析,预处理,经过优化器进行优化后提交给引擎层。通俗地说—>服务层告诉引擎层要做什么。

  • 引擎层: 提供各种存储引擎,真正的负责MySQL中数据的存储和提取。常见有innodb myisam 。innodb支持全文索引,事务(高并发),行锁,myisam 性能优先。 mysql中查询引擎语句:show engines.

    通俗地说—>引擎层会转发服务层解析出来的sql语句告诉存储层要做什么(增删改查)并且告诉存储层要以何种方式做(innodb myisam等等)。

  • 存储层: 数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

    SQL的执行流程:数据库通常不会被单独使用,而是由其它编程语言通过SQL支持接口调用MySQL。由MySQL处理并返回执行结果。首先,其它编程语言通过SQL支持接口调用MySQL,MySQL收到请求后,会将该请求暂时放在连接池,并由管理服务与工具进行管理。当该请求从等待队列进入到处理队列时,管理器会将该请求传给SQL接口,SQL接口接收到请求后,它会将请求进行hash处理并与缓存中的数据进行对比,如果匹配则通过缓存直接返回处理结果;否则,去文件系统查询:由SQL接口传给后面的解析器,解析器会判断SQL语句是否正确,若正确则将其转化为数据结构。解析器处理完毕后,便将处理后的请求传给优化器控制器,它会产生多种执行计划,最终数据库会选择最优的方案去执行。确定最优执行计划后,SQL语句交由存储引擎处理,存储引擎将会到文件系统中取得相应的数据,并原路返回。

    在我们专业老师的pdf资料里面每一层也讲得很细 见下

在这里插入图片描述

创建新表时如果不指定存储引擎,那么系统就会使用默认存储引擎,MySQL5.5 之前的 默认存储引擎是 MyISAM,5.5 之后改为了 InnoDB。 MySQL 中同一个数据库,不同的表格可以选择不同的存储引擎。

在这里插入图片描述

在这里插入图片描述

全局内存:缓冲池里面有数据缓存、索引缓存、锁信息、插入缓存等等。此外还有重做日志缓存、额外的内存池。
线程内存:Master Thread、IO Thread、Purage Thread、Page Cleaner Thread。

CheckPoint技术:缓冲池的设计目的为了协调CPU速度与磁盘速度的鸿沟。因此跟新或者删除的时候直接操作的是内存的数据,先写入重做日志,然后再修改内存池里面的数据,最后定时刷新到磁盘上。

四、MySQL文件结构

  1. 参数文件:启动MySQL实例的时候,指定一些初始化参数,比如:缓冲池大小、数据库文件路径、用户名密码等。

    my.cnf读取优先级是从左自右的顺序,但是当默认读取路径都有配置文件时,最后读
    取的参数的值,会覆盖前面读取的参数的值。

    /etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf~/.my.cnf

  2. 日志文件:比如:错误日志、二进制日志、慢查询日志、查询日志等等。

    例如:通过show variables like "error_log"来查看错误日志存放内容。

  3. socket文件:当用UNIX域套接字方式进行连接的时候需要的文件。

  4. pid文件:MySQL实例的进程ID文件。

  5. 表结构文件:用来存放MySQL表结构定义文件。

    .frm后缀命名的文件都是表结构文件,和存储引擎类型无关。所有的表都会生成一个.frm文件;

  6. 存储引擎文件:存储引擎正在存储了记录和索引等数据。

表空间可以在逻辑上管理多个数据文件,而这些数据文件又可以分布在不同磁盘中这就使得一个表的数据、索引等信息可以被记录在多个磁盘中。

(1)共享表空间:共享表空间文件以.ibdata*来命名; 共享表空间下,innodb所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。
共享表空间主要存放double write、undo log(undo log没有独立的表空间,需要存放在共享表空间)

(2)独立表空间:每个表拥有自己独立的表空间用来存储数据和索引。

(3)查看数据库是否启用独立表空间:
show variables like ‘innodb_file_per_table’;查看,innodb_file_per_table=ON,表示启用了独立表空间;

(4)使用独立表空间的优点:
a.如果使用软链接将大表分配到不同的分区上,易于管理数据文件
b.易于监控解决IO资源使用的问题;
c.易于修复和恢复损坏的数据;
d.相互独立的,不会影响其他innodb表;
e.导出导入只针对单个表,而不是整个共享表空间;
f.解决单个文件大小的限制;
g.对于大量的delete操作,更易于回收磁盘空间;
h.碎片较少,易于整理optimize table;
i.易于安全审计;
j.易于备份
如果在innodb表已创建后设置innodb_file_per_table,那么数据将不会迁移到单独的表空间上,而是续集使用之前的共享表空间。只有新创建的表才会分离到自己的表空间文件。

(5)共享表空间的数据文件配置:
innodb_data_file_path参数:设置innoDB共享表空间数据文件的名字和大小,例如innodb_data_file_path=ibdata1:12M:autoextend(初始大小12M,不足自增)
innodb_data_home_dir参数:innodb引擎的共享表空间数据文件的存放目录
目前主要是使用独立表空间,但是共享表空间也是需要的,共享表空间主要存放double write、undo log等。

五、InnoDB表存储结构

在这里插入图片描述

表空间∶表空间可看做是InnoDB存储引擎逻辑结构的最高层。

在这里插入图片描述

 :表空间由各个段组成,常见的段有数据段、索引段、回滚段等。

 :由64个连续的页组成,每个页大小为16kb,即每个区大小为1MB。页:每页16kb,且不能更改。常见的页类型有∶数据页、Undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页。

 :InnoDB存储引擎是面向行的(row-oriented),每页最多允许存放7992行数据。

a.每页=16Kb(页类型:数据页、undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页)

b.区=64个连续的页=64*16Kb=1MB

666!!!

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

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

相关文章

现货白银投资技巧实战教程

交易的实战技巧是指一些能让交易者获利的方法&#xff0c;当中一般都包含重要的操作纪律以及资金的配置策略&#xff0c;目标是要让投资者以合理的风险控制&#xff0c;来赢得持续的利润。现货白银投资技巧实战教程主要有以下几方面的内容&#xff1a; 1、充分了解交易细则。交…

腾讯云服务器新手入门_省钱入口_搭建网站全流程

腾讯云服务器新手指南从云服务器创建、远程连接到云服务器、安装操作系统、使用阿里云服务器建站教程等全流程&#xff0c;腾讯云服务器网分享腾讯云服务器从创建、使用到搭建网站全流程指南&#xff1a; 目录 一&#xff1a;腾讯云服务器创建 二&#xff1a;腾讯云服务器远…

leetcode84. 柱状图中最大的矩形(单调栈-java)

柱状图中最大的矩形 leetcode84. 柱状图中最大的矩形题目描述单调栈加数组优化栈结构解题代码演示用数组来优化栈结构,时间会更快 单调栈专题 leetcode84. 柱状图中最大的矩形 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/prob…

01、Linux运维发展与学习路线图

目录 一、Linux运维行业前景二、运维相关岗位三、Linux运维岗位薪酬四、Linux运维岗知识框架4.1、常见站点系统架构演变1 单机2 多机3 缓存4 向外扩展5 Docker 4.2 知识体系框架图4.3 技术人员成长的阶段4.4 方法论 一、Linux运维行业前景 流程化、标准化的工作越来越依赖于信…

结构光三维测量几种比较成熟的方法

1.飞行时间发 原理:通过直接测量光传播的时间,确定物体的面型。发射脉冲信号,接受发射回的光,计算距离。 精度:毫米级 优点:原理简单,可避免阴影和遮挡等问题,且仪器便携化。 缺点:精度相对较低 2.莫尔条纹法 原理:采用两组光栅,一个主光栅,一个基准光栅,通过…

vue + element 笔记

1.安装nodejs&#xff0c;cmd中运行 node -v 验证是否成功 2.安装cnpm&#xff0c;cmd中运行 npm install -g cnpm --registryhttps://registry.npm.taobao.org&#xff0c;cmd中 cnpm -v 验证是否成功 3.安装vue-cli&#xff0c;cmd中运行 cnpm install --global vue-cli&…

【Spark】介绍,部署与快速入门

文章目录 介绍核心模块Spark CoreSpark SQLSpark StreamingSpark MLlibSpark GraphX 部署命令行Web UI提交应用Local 模式Standalone配置文件添加 JAVA_HOME 环境变量和集群对应的 master 节点启动集群配置历史服务添加日志存储路径添加日志配置webui 配置高可用 Yarn模式配置文…

老照片修复:模糊褪色有划痕的老旧照片如何修复?

在我们的生活中&#xff0c;照片是记录我们生活的重要方式之一。无论是在手机相册里还是在家中的相册里&#xff0c;我们都有很多珍贵的照片&#xff0c;但是随着时间的推移&#xff0c;照片也会老化&#xff0c;甚至出现褪色、划痕、折痕、破损、发霉等情况&#xff0c;这些情…

java多线程使用与踩坑

SpringBoot使用多线程简单方法&#xff1a;地址 线程安全查阅资料参考&#xff1a;地址 背景&#xff1a; 经过上述资料查看&#xff0c;我想写个方法&#xff08;依靠notify()唤醒&#xff0c;依靠wait()等待&#xff09;实现两个线程轮流打印。 实现&#xff1a; 1.线程池配…

HCIA复习二---7月4

路由&#xff1a; 按照路由条目&#xff0c;逻辑选址。 控制层面&#xff1a;路由条目的加表&#xff1a;AD metric&#xff08;华为 priority cost&#xff09;&#xff1b; 数据层面&#xff1a;按照路由条目转发数据包---与操作---最长匹配---递归查找&#xff1b; 静态…

第四十三周周报

学习目标&#xff1a; latent-diffusion 代码 学习时间&#xff1a; 2023.06.17 - 2023.06.30 学习产出&#xff1a; 一、代码 1、前置知识&#xff1a;PyTorch Lightning执行顺序 执行顺序&#xff1a; trainer.fit(model)&#xff1a;开始训练模型。 prepare_data()&a…

教你如何将纬地数据与实景三维模型进行叠加

概述&#xff1a; 纬地是公路设计的常用软件&#xff0c;在国内的普及率很高。传统的纬地数据文件以二维线条形式呈现在CAD中。本文提出了一种新思路、新方法&#xff0c;即将纬地的设计成果与无人机航拍的高精度倾斜摄影模型叠加在一起&#xff0c;辅助设计方案复核。 ​纬地…

SpringBoot第19讲:SpringBoot 如何保证接口幂等

SpringBoot第19讲&#xff1a;SpringBoot 如何保证接口幂等 在以SpringBoot开发Restful接口时&#xff0c;如何防止接口的重复提交呢&#xff1f; 本文是SpringBoot第19讲&#xff0c;主要介绍接口幂等相关的知识点&#xff0c;并实践常见基于Token实现接口幂等。 文章目录 Spr…

培训报名小程序实战开发

目录 1 需求描述2 原型绘制2.1 首页2.2 报名列表页2.3 报名页2.4 支付页面2.5 支付成功页面2.6 我的页面2.7 我的报名页面2.8 报名详情页面 3 数据源设计4 数据源开发5 创建模型应用6 录入测试数据7 创建自定义应用8 创建页面总结 经常有人问&#xff0c;低代码学习容易么&…

c语言进阶-枚举、联合(共用体)

枚举 枚举项也有值属性 修改枚举项值属性 枚举的优点 define的实现过程 实际在预处理已经完成了M - 100 的替换&#xff0c;实际执行是int m 100&#xff1b; enum调试的时候更方便&#xff0c;代码变化过程都可以看到。 联合&#xff08;共用体&#xff09; 打印出来的三个…

前端学习——HTML5

新增语义化标签 新增布局标签 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&qu…

无限极 × 盖雅工场|劳动力管理系统项目正式启动,为多工厂管理保驾护航

6月12日&#xff0c;无限极盖雅工场劳动力管理系统启动大会在广东江门举行。无限极IT供应链系统负责人毛松和、智能制造总监胡波、新会生产中心负责人胡流云、营口生产中心负责人源博恩和人才资源共享服务负责人林岳&#xff0c;以及盖雅工场华南总经理潘磊等出席了启动大会。 …

ARM day6 (标准pin引脚启动)

A7核 led.h #ifndef __LED_H__ #define __LED_H__//寄存器封装 //声明一个结构体 typedef struct {volatile unsigned int MODER; //00volatile unsigned int OTYPER; //04volatile unsigned int OSPEEDR; //08volatile unsigned int PUPDR; //0Cvolatile unsigned int …

“全球筷子第一股”双枪科技携手纷享销客连接型CRM

近日&#xff0c;纷享销客携手双枪科技股份有限公司&#xff08;以下简称“双枪”&#xff09;&#xff0c;“主数据与订货管理系统”项目启动会在浙江杭州举行&#xff0c;双枪和纷享销客双方多位高管共同出席了当天的启动会&#xff0c;并针对双方项目组的紧密合作给予了一致…

【C++面向对象】用电管理数据管理系统(面向对象)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、51CTO技术博主 &#x…