mysql存储引擎层和服务器层,MySQL底层架构原理,工作流程和存储引擎的数据结构讲解...

2023-11-08

数据库(DataBase)是存放用户数据的地方,当用户访问、操作数据库中的数据时,需要数据库管理系统的帮助。数据管理系统的全称是DataBase Management System,简称DBMS。通常情况下我们会把数据库和数据库管理系统笼统的称为数据库,通常所说的数据库既包括存储用户数据的部分,也包括管理数据库的管理系统。

MySQL是一种关系数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件。MySQL使用 C和 C++编写,其体积小、速度快、源码开放,如今被应用在大量的中小型应用上。

1.MySQL架构

a9d3b0512c29b515d8a0af69ba504d04.png

上图为MySQL的逻辑架构图:

支持接口是第三方语言对数据库的操作接口,这里不再赘述。

1)连接层

最上层的连接池是一些连接服务,包含本地sock通信和大多数基于C/S工具实现的类似于TCP/IP的通信。主要完成一些类似于连接处理、授权认证及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全连接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

2)服务层

第二层架构主要完成大多数的核心服务功能,如SQL接口、缓存的查询、SQL的分析和优化、内置函数等。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存,如果缓存空间足够大,这样在频繁读操作的环境中能够很好的提升系统的性能。

3)引擎层

存储引擎真正的负责MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信,不同的存储引擎具有的特性不同,我们可以根据实际需进行选取。下文将对相关存储引擎进行具体介绍。

4)存储层

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

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

2.MySQL的存储引擎

MySQL在5.1版本之前默认存储引擎为MyISAM,在此版本之后为InnoDB。

1)MyISAM存储引擎

MyIsam 的存储文件有三个,后缀名分别是 .frm、.MYD、MYI,其中 .frm 是表的定义文件,.MYD 是数据文件,.MYI 是索引文件。MyIsam 只支持表锁,不支持事务。MyIsam 由于有单独的索引文件,在读取数据方面的性能很高。Myisam是以堆结构进行组织数据,其表容易损坏。

2)InnoDB

InnoDB 的存储文件有两个,后缀名分别是 .frm 和 .idb,其中 .frm 是表的定义文件,而 idb 是数据文件。InnoDB 中存在表锁和行锁,不过行锁是在命中索引的情况下才会起作用。InnoDB 支持事务,且支持四种隔离级别(读未提交、读已提交、可重复读、串行化),默认的为可重复读。

两种存储引擎的对比:从MyISAM和InnoDB的存储文件可看出,MyISAM注重的是对数据的快速读取,但由于MyISAM不支持事务,同时缺乏灵活性。而InnoDB支持事务和行级锁,因此在5.1之后MySQL的默认存储引擎为InnoDB。

3)两大存储引擎的数据结构

MyISAM和InnoDB两种存储引擎都采用了B+树(有关B+树的概念和由来,请见笔者相关博客)的数据结构,但具体实现方式完全不同。

MyISAM的B+树实现示例图:

c1bfd8648439adbc8d0976fecb708e83.png

MyISAM的B+树叶子节点存储的并不是数据,而是数据地址,因此也称为非聚集索引,搜索按照B+树的搜索算法进行。

InnnDB的B+树实现示例图:

42d553d6927f9165d869687815e1a1ff.png

InnoDB的B+树叶子节点存储的就是数据本身,因此也称为聚集索引。从实现数据结构可知,如采用InnoDB存储引擎,不宜设置过长的主键。另外,使用InnoDB尽量采用自增(自减)的数据为主键,否则,由于叶子结点处直接存储数据的原因(数据即为索引),会造成频繁的B+的分裂合并调整,效率十分低下。从数据结构的实现看出,当读写更新比较频繁,读写一致性要求很高的业务,采用InnoDB更佳。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql存储引擎层和服务器层,MySQL底层架构原理,工作流程和存储引擎的数据结构讲解... 的相关文章

  • Spring-boot返回Json格式数据

    Spring boot返回Json格式数据 Spring boot返回json用到的注解为 RestController 新建一个maven项目 编写pom xml文件
  • python 引用(import)文件夹下的py文件的方法

    Python包含子目录中的模块方法比较简单 关键是能够在sys path里面找到通向模块文件的路径 下面将具体介绍几种常用情况 1 主程序与模块程序在同一目录下 如下面程序结构 src mod1 py test1 py 若在程序test1
  • 【死磕 Redis】----- Redis 数据结构: skiplist

    原文 https www cmsblogs com category 1391389927996002304 chenssy 关于跳跃表其实在 JUC 里面有一个并发容器就是利用跳跃表来实现的 ConcurrentSkipListMap 死
  • python开发_常用的python模块及安装方法

    adodb 我们领导推荐的数据库连接组件 bsddb3 BerkeleyDB的连接组件 Cheetah 1 0 我比较喜欢这个版本的cheetah cherrypy 一个WEB framework ctypes 用来调用动态链接库 DBUt
  • SpringBoot2.0(Spring读取配置文件常用方法,打war包在Tomcat中启动)

    目录 一 SpringBoot中读取配置文件的常用方法 1 1 使用 Value读取 1 2 使用 ConfigurationProperties 1 3 使用Environment 1 4 自定义配置文件读取 二 SpringBoot部署
  • 直接修改html文本页面没变化,DOM问题:点击按钮的时候,修改input元素的value属性值,为什么在HTML结构上没有变化?...

    代码 无标题文档 span background lime window nl ad function 获取input span var oTxt document getElementsByTagName input 0 var oBtn
  • 什么是元宇宙:我们在哪里,我们要去哪里

    自Facebook于 2021 年 10 月 28 日更名为 Meta 以来 启发新名称的模糊概念一直是讨论的热门话题 虽然元宇宙似乎是 Meta 野心的产物 但事实并非如此 一些人会争辩说 马克扎克伯格在Connect 2021会议主题演
  • 基于 FFmpeg 的跨平台视频播放器简明教程(六):使用 SDL 播放音频和视频

    系列文章目录 基于 FFmpeg 的跨平台视频播放器简明教程 一 FFMPEG Conan 环境集成 基于 FFmpeg 的跨平台视频播放器简明教程 二 基础知识和解封装 demux 基于 FFmpeg 的跨平台视频播放器简明教程 三 视频
  • qt透明度设置

    QPaintEvent QPainter painter this painter setRenderHint QPainter Antialiasing painter setBrush m color painter setPen Qt
  • MySQL的优化

    目录 一 概念 二 查看SQL执行频率 三 定位低效率执行SQL 定位低效率执行SQL 慢查询日志 操作 定位低效率执行SQL show processlist 四 explain分析执行计划 字段说明 explain中的id explai
  • STM32+LittleVgl(LVGL)文件系统使用

    目录 一 硬件及软件准备 二 前言 三 显示效果 四 移植文件到工程目录下 五 将文件添加进工程中 六 使能文件 七 修改 lv port fs c 文件 八 修改main c 九 将图片资源拷贝到外部存储器中 一 硬件及软件准备 完整工程
  • 【迪文屏】踩坑指南——汉字显示乱码、背景图不显示问题的解决方法

    迪文屏支持的字库文件有HZK DZK Bin格式 迪文屏文字乱码请按下图中步骤一个个排查 迪文屏更改背景显示不出来可能是未生成icl文件或者icl文件位置未设置对 所以系统找不到 生成的icl图标库文件后 记得在CFG配置文件更改ILC位置
  • 数据库之DML的基本操作

    DML 数据操作语言 对表记录的操作 增 删 改 1 插入数据 insert into 表名 列名1 列名2 values 列值1 列值2 在表名后给出要插入的列名 其他没有指定的列插入NILL 在values后给出列值 值的顺序和个数必须
  • HTTPS工作原理原理及常见状态码

    HTTPS工作原理原理 简介 HTTPS是常用的web协议 用来交互网页数据 由于HTTP是不加密的 在公网上明文传输 缺少保密性 所以出现了安全加密的HTTP协议 HTTPS协议 HTTPS协议是在SSL协议基础上的HTTP协议 SSL协
  • JVM系列(八) JVM 垃圾收集算法

    前面我们了解了很多JVM配置垃圾回收的方式 但是具体垃圾是如何被回收的 或者说垃圾回收算法有哪些 今天我们文章主要讲解一下垃圾回收算法 1 分代收集理论 我们都知道 很早的JVM会把堆分为几个区域 新生代 老年代 永久代等区域 为什么要这么
  • JSP详细讲解

    JSP详细讲解 前言 一 JSP 介绍 二 JSP 运行原理 1 JSP 技术特点 2 JSP 与 Servlet 区别 三 JSP 的使用 1 JSP 的三种原始标签 2 JSP 原始标签的使用 3 JSP 的指令标签 4 JSP 指令标
  • 王爽汇编语言课程设计1

    一 实验要求 在屏幕输出实验七中的数据 二 设计思路 1 将实验七的程序编写成一个子过程finishing 在主程序中调用 可以获得实验七种指定格式的table段数据 设置es bx指向table段中第一行 2 创建一个数据缓存区buffe
  • 双电源切换电路的几种方案

    一 使用两个二极管 VBUS和VBAT单独供电的情况很好理解 由于二极管的单向性 不会发生电流的倒灌 当VBUS和VBAT都有电时 VBUS为5V VBAT为3 7V 此时D17处于反向截至状态 只有VBUS输出但VOUT 优点是方案简单
  • nuxt项目中引用less/scss全局变量

    nuxt项目中有些样式需要经常使用 并且未来有可能会改 比如主题色 theme color 所以希望在一个地方定义后 后面直接引用变量即可 但是正常使用时 less的变量是不能跨文件使用的 下面使用 nuxtjs style resourc

随机推荐

  • 国外IP地址汇总

    ip route 1 0 0 0 255 255 255 0 10 201 130 13 ip route 1 1 1 0 255 255 255 0 10 201 130 13 ip route 1 2 3 0 255 255 255 0
  • SylixOS下移植C++程序——命名粉碎

    1 概念 1 1 命名粉碎 命名粉碎 name mangling 又称命名修饰 name mangling是一种在编译器和链接器之间用于通信的符号协议 其目的在于按照程序中的语言规范 使符号具备足够的语义信息以保证链接过程准确无误的进行 编
  • props传递对象_解决vue组件props传值对象获取不到的问题

    先说问题 父组件利用props向子组件传值 浏览器 console 有这个值 但是获取不到内部的属性 困了我3个小时 真的 personal console 以下为原代码 1 home vue 父组件 personal是被传的参数 pers
  • 可视化卡片笔记写作?我试了最近才开放的 Heptabase

    2021 年 12 月末 我在微信里面读了 Alan 詹雨安 Heptabase 开发者 的文章 立即对更名不久的 Heptabase 来了兴趣 靠着海玮的邀请 我加入了 Heptabase 的 Discord 做了自我介绍 当然 也加入了
  • js常用hook

    一 Hook 技术原理 Hook是一种钩子技术 在系统没有调用函数之前 钩子程序就先得到控制权 这时候钩子函数既可以加工处理该函数的执行行为 也可以强制结束消息的传递 简单来说就是修改原有的js代码就是hook JS 是一种弱类型语言 同一
  • GB28181平台如何接入无人机实现智能巡检?

    大家都知道 无人机巡检系统 有效解决了传统巡查工作空间和时间局限问题 降低人力工作成本 有效替代人工巡检工作模式 智能巡检系统通过人工智能技术和机械智能技术完美结合 在工业等场景下 应用非常广泛 本文旨在讲如何实现无人机 如大疆无人机 数据
  • Java泛型机制

    Generics 泛型 一个接口或类可能被声明为一个或者多个类型的参数 该类或接口写在尖括号中 提供的实体类需要属于该接口或类 Generic Programming 泛型编程 泛型类可以是编码更安全以及方便阅读 尤其是在集合类中 Java
  • 【隧道篇 / PPTP&L2TP】(5.2) ❀ 01. PPTP & L2TP 连接 ❀ FortiGate 防火墙

    简介 虽然有SSL 但是因为要安装 FortiClient 客户端软件 很多人还是喜欢用PPTP或L2TP 理由很简单 那就是只要是Windows就可以连 不用安装其它软件 PPTP 与 L2TP 协议的联系与区别 PPTP Point t
  • JAVA三种多数据源配置详解(一)

    在大型项目的开发中 我们可能因为微服务 分布式 集群等架构的影响 而需要到不同的数据库中去查询需要对应的数据 这时 单一的数据库配置就无法满足业务需求 下面我会介绍集中不同场景下的多数据源配置 大家可以根据自身情况进行选择和实现 yml文件
  • 纪念古龙诞辰:论古龙的江湖为何没有一“tong”?

    古龙 nbsp 原名熊耀华 1938年6月7日生于香港 武侠小说家 新派武侠小说泰斗 代表作品 多情剑客无情剑 绝代双骄 楚留香传奇 武林外史 等 有人喜欢金庸 也有很多人喜欢古龙 他们之间的同与不同 以及那些至今仍然令我们备受感动的地方
  • vue中a标签下载本地文件-未找到【已解决】

    首先看一下我的情况 如下 目录如图 代码如下 a href public kjxz pptx 课件下载 a 一切看起来很正常 但是结果如下 然后我搜了一下发现原来href路径的问题 原来使用 public kjxz pptx 文件会找不到
  • 漫步IOS--三目运算符、switch、枚举

    1 三目运算符 三目运算符的定义 表达式1 表达式2 表达式3 例如 a gt b 2 5 三木运算符也是有返回值的 返回值等于对应的表达式的返回值 2 switch 在c语言中 switch只支持整型 但是这里的整型包括 整型 字符 布尔
  • 如何将文档上传到 ChatGPT

    OpenAI 一直在为 ChatGPT 添加几个有趣的功能 包括对网页浏览和插件的支持 但是 仍然没有办法本地上传文档并根据其上下文提出问题 当然 有些用户可以在他们的数据上训练 AI 聊天机器人 但并不是每个人都了解如何设置工具和库 因此
  • 华为OD机试 C++ 去除多余空格

    题目 你需要写一个功能 它能处理一段文本 去除其中不必要的空格 但是如果这些空格被一对单引号包围起来 就保留它们不变 同时 你还要调整一些特定词汇的位置 这些词汇的位置会以坐标的方式给出 坐标要基于新的文本 特别注意 关键词的位置一定不是空
  • Unity 入门 Input 类

    1 获得键盘 Input GetKey KeyCode A Input GetKeyDown KeyCode A Input GetKeyUp KeyCode A 2 获得鼠标信息 Input mousePosition 鼠标位置 Inpu
  • 关系型数据库是如何运作的

    一说到关系型数据库 我总感觉缺了点什么 如果你尝试透过 关系型数据库是如何运作的 的关键词句来进行搜索 其搜索结果是少量的而且内容是简短的 难道说是由于它已经太老旧而已经不再流行吗 作为一名开发者 我讨厌使用我不明白的技术 此外 关系型数据
  • s、x、t -learner

  • DICOM之Transfer Syntax

    Transfer Syntax A Transfer Syntax is a set of encoding rules able to unambiguously represent one or more Abstract Syntax
  • ChatGPT在线个人小助手应用搭建

    ChatGPT在线个人小助手应用搭建 在线体验 点我在线体验 因为openAI账户申请后会默认有18美元的账户 openAI每次调用大概会花掉0 01美元 所以为了防止恶意刷api 无意义聊天 页面做了密码限制 如果密码不对 是不会启用op
  • mysql存储引擎层和服务器层,MySQL底层架构原理,工作流程和存储引擎的数据结构讲解...

    数据库 DataBase 是存放用户数据的地方 当用户访问 操作数据库中的数据时 需要数据库管理系统的帮助 数据管理系统的全称是DataBase Management System 简称DBMS 通常情况下我们会把数据库和数据库管理系统笼统