MySQL体系架构 mysql数据库架构图
qiyuwang 2024-10-08 10:23 9 浏览 0 评论
MySQL是一个开源的关系型数据库管理系统,其性能高、成本低、可靠性好,加之web应用的兴起,现今已成为最流行的开源数据库之一。
在对MySQL系列专栏学习之前,首先要介绍一下MySQL的整体架构。
- Connection Pool(连接池):用于缓存建立的连接,为提升MySQL服务器的性能,尽可能的减少建立连接时的消耗。
- SQL Interface(SQL接口):接收客户端的SQL命令,并返回用户查询结果。
- Parser(解析器):对SQL进行语法校验,然后将SQL分解成相应的数据结构。
- Optimizer(优化器):优化客户端提交的SQL语句,以此来达到最佳的执行效率。
- Caches&Buffers(缓存器):查询缓存,可以加速查询。
- Pluggable Storege Engines(存储引擎):MySQL在5.1版本采用了插件式的架构,所有的存储引擎以插件的形式加载,我们常用的存储引擎如InnoDB。
- File System(File & Logs)(文件系统):索引、数据、表结构等的物理存储区。
下面我们就围绕MySQL最常用的存储引擎InnoDB展开讲解。
InnoDB存储引擎
InnoDB是MySQL的的一个常用存储引擎,是第一个完整支持ACID事务的存储引擎,其具有行锁设计,支持MVCC、支持外键、支持一致性非锁定等能力。
InnoDB存储引擎包含两大重要结构:内存池与文件系统,如下图是该存储引擎的整体架构:
- Background Threads(后台线程):后台线程的作用是负责刷新内存池中的数据,保证其新鲜度;同时也会将修改的数据刷新到对应磁盘文件中。
- Buffer Pool(内存缓冲池):内存缓冲池是一块很大的内存快,用于存放各种缓存数据,该区域的数据是以页(没页16K)为单位存储的,InnoDB会将文件中的数据读取存放到这里;同时所有的数据修改都是先修改缓冲池中的页,然后由后台线程定期将脏页(发生修改的页)刷新到磁盘文件中。
- 文件系统:这里存放的是物理数据文件,包含了表结构文件、索引文件、数据文件、临时缓存文件、日志文件等。
- InnoDB有三大特性:内存缓冲池、插入缓冲区、自适应哈希索引。
后台线程
InnoDB存储引擎至少包含7个后台线程:1个master thread(主线程)、1个lock thread(锁监视线程)、1个monitor thread(错误监视线程)以及4个IO thread,IO线程分别为insert buffer thread(管理插入缓冲区线程)、log thread(管理日志缓冲区的线程)、read thread和write thread。
内存池
InnoDB存储引擎内存由:buffer pool(缓冲池)、redo log buffer(重做日志缓冲池)及additional memory pool(额外内存池)组成,其中缓冲池是最大的一部分。
- buffer pool(缓冲池)由N个buffer page(缓冲页)构成,每个缓冲页的大小为16K(如上图中小方块)。缓冲池中又含量了多种数据页类型:index page(索引页)、data page(数据页)、undo page(undo页)、insert buffer(插入缓冲区)、adaptive hash index(自适应哈希索引)、lock info(多信息)及data dictionary(数据字典信息)等。
- redo log buffer(redo日常缓冲)是重做日志写入缓冲区,后续的后台线程会将日志刷到重做日志文件。
- additional memory pool(额外内存池)用于存放缓冲控制对象需要的LRU、锁、等待信息。
插入缓冲
存储引擎性能的最大影响因素是随机IO,插入聚集索引一般是顺序插入(id是递增的),不需要随机读写,所以没有此问题。然而非聚集索引读写是离散的(B+树结构),为保证非聚集索引的插入性能而设计。
若需要插入的索引页在缓冲池中,则直接插入,不在则会将其放入插入缓存,缓存区中同索引页的数据还会合并,然后再刷新到索引文件。
自适应哈希索引
根据当前视图的数据访问频次在缓冲池建立一个hash索引,这是一个自适应的辅助索引,该自适应hash索引值适用于等值查询。
文件系统
InnoDB磁盘中的结构分为几类:表空间、Redo Log、Doublewrite Buffer、Undo log。
- 表空间:分为System Tablespace(系统表空间)、Temporary Tablespaces(临时表空间)、General Tablespaces(常规表空间)、Undo Tablespaces(Undo表空间)以及file-per-table表空间,系统表空间包括Change Buffer。
- Redo log:存储的是log buffer刷到磁盘的数据,重做日志文件组内的文件会循环使用。
- Doublewrite buffer:InnoDB将数据页写到文件之前存放的位置。
- Undo log:存在于global临时表空间中,用于事务的回滚。
- frm:表结构定义文件。
我们重点介绍一下表空间结构。
表空间文件结构
表空间是InnoDB存储引擎逻辑结构的最高层,所有的数据都是存放在表空间中。InnoDB默认有一个共享表空间ibdata1,如果我们开启了file_per_table,则每张表内数据可以单独存放到一个表空间(注:每张表的数据、索引和插入缓冲存放在单独表空间,其它类型数据,如Undo log、Ddouble write buffer等仍然在共享表空间)。
具体表空间结构如下:
- Segment(段):表空间就是由N个段组成的,包括数据段、索引段、回滚段等。InnoDB的数据段时由B+树组织的,所有的数据段都是叶子节点,同时这些叶子节点在磁盘上都是连续的。而索引段都是非叶子节点,回滚段则用于事务回滚和多版本控制。每个段又包含256个区,占用256M。
- Extent(区):区是有64个连续的页组成的,每个页大小为16K,组成的区大小为1M。
- Page(页):页是InnoDB存储的最基本单位,因为其是InnoDB磁盘管理的最小单位。每页的大小为16K(操作系统磁盘分页大小为4K,这里会引入一个问题,后续我会在《InnoDB Double Write技术》详细讲解)。常见的页类型有:数据页、Undo页、系统页、事务数据页、插入缓冲位图页等。
- Row(行):InnoDB存储引擎是面向行的(注:也有面向列的数据库,例如ClickHouse),也就是说数据的存放按行进行存放的。每个页存放的行在7992行内。
行结构
InnoDB存储引擎与主流的关系型数据库的意义,记录是以行的形式存储的。InnoDB提供了Compact和Redundant两种格式来存放行记录数据,Redundant是一个历史结构兼容格式,我们主要介绍Compact格式。
Compact格式是MySQL5.0引入的,其结构如下:
- 首部是所有列的长度列表(逆序存放),当列的长度小于255字节时,其长度为1字节,否则用2字节表示,其最大值不超过2字节(注:这也就是为什么varchar最大长度为65535即2^16的原因),我们举个例子:
某行记录有三个字段分别是column1/column2/column3,其值分别为aaaa/b/cc,那么长度列表则为02 01 04
- NULL标志位,该标志位指示了该行是否有NULL值,有则为1。
- 记录头信息,固定占用5个字节,其中包含deleted_flag(删除标记)、记录在页堆中的相对位置信息、下一个记录的相对位置等信息。
- 每一行还包含两个隐藏列,事务ID列(6字节)和回滚指针列(7字节)。
- 若表没有定义Primary Key,则会增加一个RowID列(6字节)。
页结构
InnoDB数据页由七个部分组成,其中File Header、Oage Header、File Trailer、Infimun&Supremun Records4个是固定大小的,具体结构如下:
- File Header(文件头):38字节,其中包含了页的校验和、页类型、页序号、页在表空间的偏移量、前后页的指针、LSN等信息。
- Page Header(页头部信息):56字节,其中包含业内的记录数、Free Space在页面中的地址偏移、页目录槽数等信息。
- Infimun+Supremun Records:26字节,每个页都有这两个虚拟的行记录。用来限定页内记录的边界,Infimun页面中的最小记录,Supremun最大记录。
- User Records(用户记录):实际存储用户行记录的地方。
- Free Space(页的空闲空间):该区域则是待分配的空闲区域,有新的记录插入时则在该区域分配。
- Page Directory(页目录):这是一个稀疏目录,记录的是记录的分组信息(每组4-8个记录),每个槽指向分组记录的开始。查询记录时可以使用这个目录二叉查找快速定位记录所在的组,然后通过记录的next_recored指针,快速的获取到要查询的记录(注:这个查找与B+树的搜索不同,B+树是在内存中对页的组织,通过B+树找到页,在通过页目录定位到记录所在组,组内在用next_record指针查找)。
- File Trailer(文件结尾):8字节,保证页的完整性,检查其校验和、LSN值与File Header的校验和,即LSN值是否一致,不一致就说明发生了磁盘损坏或者宕机保存数据不完整等情况。
至此整个InnoDB的核心结构剖析完成。
总结
- MySQL包含连接池、SQL接口、解析器、优化器、缓存器、存储引擎、文件系统。
- InnoDB有三大特性:内存缓冲池、插入缓冲区、自适应哈希索引。
- InnoDB磁盘中的结构分为几类:表空间、Redo Log、Doublewrite Buffer、Undo log。
- InnoDB表空间结构分为:段、区、页、行。
- InnoDB页结构包含:文件头、页头部信息、Infimun+Supremun记录、用户记录、页的空闲空间、页目录、文件结尾。
- InnoDB行结构包含:变长字段长度列表、NULL标志位、记录头信息、RowID、事务ID、回滚指针、列数据。
《MySQL系列专栏》持续更新中,关注我不迷路[送心]。
相关推荐
- 在Word中分栏设置页码一页两个页码的技巧!
-
施老师:在正常情况下,Word文档中一页只会出现一个页码。但在某种情况下,比如说:用了分栏后,我们希望一页中出现两个页码,那应该如何实现呢?今天,就由宁双学好网施老师来为大家讲一下,利用域来实现一页两...
- 如何在关键时刻向上自荐(如何在关键时刻做出正确选择)
-
抓住机会,挺身而出有种时刻叫“关键时刻”,关键时刻,作为一个认为自己有能力的、训练有素的人,应该考虑挺身而出,甚至应该不考虑就挺身而出。...
- WPS Word:跨页的文档表格,快速调整为一页。#Excel
-
如何快速将跨页的文档表格调整为一页?需要根据两种情况分别处理。如果表格所有行的行高相同,调整为一页的方法有两种。第一种方法是将光标移动到表格内,然后将鼠标移动到表格右下角的方框处,按住鼠标左键向上拖动...
- word文档插入下一页分节符(word下一页分页符)
-
在word文档中,对文档页面进行分页是特别常见的操作,其中的下一页分节符也是用得比较多的,但是一些人不太清楚在哪里设置,也不知道它具体能实现的功能是什么。接下来看看如何在word文档中插入下一页分节符...
- word文档如何设置某一页纸张的方向
-
word文档页面方向有横向和纵向,纵向是默认的纸张方向,有时我们需要将页面设置为横向,或只设置其中某一页方向,应该怎么操作呢?一起来看看下面的详细介绍第一步:...
- word怎么单独设置一页为横向(word2019怎样设置单独一页为横向)
-
word里面其中一页可以改为横向的吗?经过实际操作发现是完全可以的。...
- Word如何设置分栏,如何一页内容同时显示一栏和两栏
-
我们使用Word文档,有时需要用到两栏的排版,甚至一页内容同时包含一栏和两栏的排版,这种格式怎么设置呢?具体步骤如下:首先是两栏排版的设置,直接点击Word文件上方工具栏【布局】,选择【分栏】下面的【...
- Word怎么分页?这三个方法可以帮到你
-
我们不仅可以利用Word编辑文档,还可以编辑文集呢。但是有时候会出现两个部分的文章长短不一,我们需要对文档进行分页处理。这样可以方便我们对文档进行其他操作。那么Word怎么分页呢?大家可以采用下面这...
- Word内容稍超一页,如何优化至单页打印?
-
如何将两页纸的内容,缩到一页打印呢?有时候一页纸多一点内容,我们完全可以缩一下,放到一页来打印。...
- [word] word 表格如何跨行显示表头、标题
-
word表格如何跨行显示表头、标题在Word中的表格如果过长的话,会跨行显示在另一页,如果想要在其它页面上也显示表头,更直观的查看数据。难道要一个个复制表头吗?当然不是,教你简单的方法操作设置Wo...
- Word表格跨页如何续上表?(word如何让表格跨页不断掉)
-
长文档的表格跨页时,你会发现页末空白太多了,这时要怎么调整?选中整张表格,右击【表格属性】,点击【行】选项,之后勾选【允许跨页断行】,点击确定即可解决空白问题。...
- Word怎么连续自动生成页码,操作步骤来了!
-
Word怎么连续自动生成页码,操作步骤来了!...
- word文档怎么把两页合并成一页内容?教你4种方法
-
word怎么把两页合并成一页?word怎么把两页合并成一页?用四种方法演示一下。·方法一:把这一个文档合并成一页,按ctrl加a全选文档,然后右键点击段落,弹出的界面行距改成固定值,磅值可以改小一点,...
- 如何将Word中的一页的纸张方向设置为横向?这里提供详细步骤
-
默认情况下,MicrosoftWord将页面定向为纵向视图。虽然这在大多数情况下都很好,但你可能拥有在横向视图中看起来更好的页面或页面组。以下是实现这一目标的两种方法。无论使用哪种方法,请注意,如果...
- Word横竖混排你会玩吗?(word横排竖排混合)
-
我们在用Word排版的时候,一般都是竖版格式,但偶尔会需要到一些特殊的版式要求,比如文档中插入的一个表格,横向的内容比较多,这时就需要用到横版,否则表格显示不全。这种横竖版混排的要求,在Word20...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- navicat无法连接mysql服务器 (65)
- 下横线怎么打 (71)
- flash插件怎么安装 (60)
- lol体验服怎么进 (66)
- ae插件怎么安装 (62)
- yum卸载 (75)
- .key文件 (63)
- cad一打开就致命错误是怎么回事 (61)
- rpm文件怎么安装 (66)
- linux取消挂载 (81)
- ie代理配置错误 (61)
- ajax error (67)
- centos7 重启网络 (67)
- centos6下载 (58)
- mysql 外网访问权限 (69)
- centos查看内核版本 (61)
- ps错误16 (66)
- nodejs读取json文件 (64)
- centos7 1810 (59)
- 加载com加载项时运行错误 (67)
- php打乱数组顺序 (68)
- cad安装失败怎么解决 (58)
- 因文件头错误而不能打开怎么解决 (68)
- js判断字符串为空 (62)
- centos查看端口 (64)