登录  | 加入社区

黑狼游客您好!登录后享受更多精彩

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

查看: 850|回复: 0

关系型数据库MySQL之InnoDB体系布局

[复制链接]

176

主题

176

帖子

0

现金

黑狼菜鸟

Rank: 1

积分
0
发表于 2019-3-8 09:26:08 | 显示全部楼层 |阅读模式 来自 江苏徐州
hv14l16C7O1il1OA.jpg
一、InnoDB 体系布局



InnoDB 存储引擎是 MySQL 5.5 版本后的默认存储引擎,支持事件 ACID,回滚,体系瓦解规复本领及多版本并发控制的事件安全,重要用于 OLTP 数据库业务场景;支持自增长列(auto_increment);支持外键束缚(foreign key);支持 MVCC 的行级锁;利用 Btree 索引;假如你还没有看到前面一文先容 MySQL 体系布局,那么保举戳此检察[MySQL 体系布局详解],先容完 MySQL 体系布局,下面来一起学习 InnoDB 体系布局。
 
下图为 MySQL 5.7 官方手册下 InnoDB 体系布局,详情可见官方手册。
 
nm3vVpZ34Xv75Clv.jpg

                            
InnoDB存储引擎重要包罗多个内存池以及背景线程。
 
内存池
 
内存池由 Buffer Pool 包罗(undopage、Change buffer page、AdaptiveHash Index、Lock info、datadictionary),Double write Buffer,Additional Memory pool、Redo Log Buffer 构成,重要维护历程/线程的内部数据、缓存磁盘数据,修改文件前先在内存中修改;
 
MySQL5.7 官方文档中关于 InnoDB 存储引擎的体系布局解说包罗:
















Buffer PoolChange BufferAdaptive Hash IndexRedo Log BufferSystem TablespaceInnoDB DataDictionaryDoublewrite BufferUndo LogsFile-Per-TableTablespacesGeneral TablespacesUndo TablespaceTemporary TablespaceRedo Log 

共享表空间和独立表空间
 
InnoDB 有表空间的概念,包罗共享表空间和独立表空间(独立表空间的模式中也要有体系表空间 ibdata1,来用于存储内部的数据字典、Undo日记等,通过 InnoDB_file_per_table 参数设置启用独立表空间),默认独立表空间模式下会在数据目次下创建 tablename.ibd、tablename.frm 文件,但假如单表增长过快如许就很轻易出现性能题目。共享表空间的数据和文件放在一起方便管理,但共享表空间无法在线接纳空间,若想要接纳必要将全部的 InnoDB 表中的数据备份、删除原表,然后再把数据倒回到原表布局一样的新表中。

 
暂时表空间和通用表空间
 
MySQL 5.7 把暂时表的数据从体系表空间中抽离出来,形成本身的独立的表空间参数innodb_temp_data_file_path, 而且把暂时表的相干检索信息生存在体系信息表的 information_schema 库下的 innodb_temp_table_info 表中。但现在还不能界说暂时表空间文件的存放路径,只能和 innodb_data_home_dir 同等。暂时表空间定名为 ibtmp1,默认巨细为 12 M。



Bz7xA57Zfb3nvf77.jpg



通用表空间就是将多个表放置在同一个表空间中,可以根据 活泼度来分别表,存在差别的磁盘上,可淘汰 metadata 的存储开销,但很少在生产情况中利用。
 
redo
 
InnoDB 支持记载 Redo文件,记载对全部页面的修改(页面物理布局的变动)操纵,可以通过相干的参数举行自界说设置 Redo文件存储路径。
 
undo
 
InnoDB 支持记载 Undo 文件,记载数据修改前的备份,存储在共享表空间中。用户包管事件的原子性(规复)和实现 MVCC 多版本并发控制,辅助完成事件的长期化(Undo 信息会长期化)。可通过相干参数举行自界说设置。
 
更改缓冲
 
更改缓冲(change buffer),基于聚集索引的操纵是次序的,不会造成数据库随机读取,但修改非聚集索引时就会产生大量的随机读写。当修改非聚集索引的数据时,修改操纵并非及时更新索引的叶子页,而是把多少对同一页面的更新缓存起来做归并(merge)将一次性更新操纵,转化随机 IO 为次序 IO ,如许可以制止随机 IO 带来性能消耗,进步数据库的写性能。
 
两次写
 
两次写(double write),(重做日记记载的是页的物理操纵,假如页自己破坏,对其重做就没故意义了,在应用重做日记前,必要一个页的副本。



先通过页的副本还原该页,再应用重做日记举行规复)当 MySQL 将脏数据 flush 到 data file 的时间,先利用memcopy 将脏数据复制到内存中的double write buffer,之后通过double wirte buffer 再分 2 次,每次写入 1M 到共享表空间,然后立刻调用 fsync 函数,同步到磁盘上;



将数据页(page)加载到内存(InnoDB buffer)->更新数据产生脏页(dirty page)->利用 memcopy 将脏数据复制到内存中的double write buffer(size=2M)->double wirte buffer 再分2次,每次写入1 M 到共享表空间(ibdata 文件)->调用 fsync 函数,同步到磁盘;



利用memcopy将脏数据复制到内存中的double write buffer(size=2M)->double wirte buffer 再分 2 次,每次写入  1M 到共享表空间(ibdata 文件)就是 double 的过程。

 
自顺应 hash 索引
 
自顺应 hash 索引(adaptive hash index),InnoDB 会监控表上索引的查找环境,假如通过创建 Hash 索引能带来性能的提拔,则会主动创建 hash 索引,该过程只能由MySQL Server 自行控制,无法人工干预且只实用于等值索引查询;从 MySQL 5.7.8 开始,自顺应哈希索引搜刮体系是分区的,每个索引都会绑定到一个特别的分区上面,且各个分区都有本身的锁存器来举行掩护。

 
分区可以通过 InnoDB_adaptive_hash_index_parts 参数来控制,该参数的默认值为 8  个,最大可设置为 512。通过设置分区值,可以低落争用,进步并发性。还可以通过下令 SHOW ENGINE INNODB STATUS  所输出的 SEMAPHORES 部门来监控自顺应哈希索引的利用及其竞争环境。假如你看到很多线程正在等候一个在 btr0sea.c 中创建的 RW-latch,则它大概被用于禁用自顺应哈希索引。



eSS2ZzsAG7W3KB7r.jpg



背景线程
 
背景线程包罗(Mater Thread、IOThread、Lock Monitor Thread、ErrorMonitor Thread、Purge Thread、PageCleaner Thread)革新内存池中的过程数据,管理维护 InnoDB 存储引擎正常工作。

 
InnoDB 重要的背景线程如下图。
 
Hv41m91NV9vPDzIu.jpg



Master Thread 是一个非常焦点的背景线程,重要负责将缓冲池中的数据异步革新到磁盘,包管数据的同等性,包罗:脏页(dirty page)的革新、归并插入缓冲(insert buffer merge)、回滚页接纳(undo purge)等。innodb_max_dirty_pages_pct 脏页刷盘的设置参数,新版默认 75。



TvVEQsbr78Rp8mEq.jpg



二、InnoDB 表逻辑布局



InnoDB 逻辑存储单位重要分为表空间、段、区和页,层级关系为tablespace——>segment——>extent(64 个 page, 1MB )——>page(默认 16K)。


rMSZYfa93G5eTLx9.jpg


表空间
 
表空间是 InnoDB 存储引擎逻辑布局的最高层,全部的数据都是存储在表空间中的,表空间又可以分为体系表空间、独立表空间。MySQL 5.7 之后从体系表空间中抽离出来了暂时表空间(temporarytablespace)、通用表空间(general tablespace)。

 

 
,表空间是由段构成可以把表明白为一个段,又数据段,索引段,回滚段等。每个段又由 N 个区和 32 个零星的页构成,段空间扩展是以区为单元举行扩展的。
 

 
,由 64 个一连的页构成,是物理上一连分配的一段空间,每个区固定巨细 1MB。
 

 
,InnoDB 的最小物理存储分配单元是 page,每个页 16KB 且不能修改,数据页,索引页,体系页等。
 

 
,页内里记载着行记载的信息, InnoDB 存储引擎是面向行的,也就是数据是按行存储的,每页最多答应存放 7992 行数据。
 
行记载格式
 
InnoDB 存储引擎有两种文件格式,一种叫 Antelope,另一种叫 Barracuda。在 Antelope 文件格式下,有 compact 和 redundant 两种行记载格式,而在 Barracuda 文件格式下,有 compressed 和 dynamic 两种行记载格式。


对于 Compact,不管是 char 型照旧 varcha r型,null 型都是不占用存储空间的;对于Redundant,varchar 的 null 不占用空间,char 的 nul l型是占用存储空间的。


Varchar 范例的长度是 65535 ,但现实一样平常除开其他开销大概 65530 左右,同时这个限定是一整行数据的长度。
 





CREATE TABLE IF NOT EXISTStbl_varchar(a varchar(22000), b varchar(22000), c varchar(22000))charset=latin1 engine=innodb;   #会报错,由于一行总长大于了65535 

数据页布局
 
File Header(文件头):记载页的头信息,固定长度 38 字节;


Page Header(页头):记载页的状态信息,固定长度 65 字节;


Infimum+SupremumRecords:两个假造的行记载,用于限定记载的界限;


User Records:用户记载,现实记载的内容,InnoDB 接纳 B+ 树索引构造存储表;


Free Space:空闲空间,链表数据布局,记载删除后会被参加空闲空间;


Page Director:页目次,存放记载的相对位置,B+ 索引不能找到详细的一条记载,只能找到该记载地点的页,数据库把页载入内存,再通过 PageDirector 查找详细记载行;


File Trailer:文件末端信息,固定长度 8 字节;


v1rhHXY1210mY1j1.jpg




三、内存布局


MySQL 的内存布局和 Oracle 内存布局相似,也可分为 SGA(体系全局区)和 PGA(体系全局区),数据库的内存参数设置可以利用 [show variables like ‘%buffer%’] 下令检察。



tmIX9mX9UywDK9D9.jpg

 

内存重要由以下部门构成,由于篇幅详细每个功能临时不做先容,后期有时机在说。



q1n51CA9T4NZ9A2A.jpg



留意:temp_table_size 和 max_heap_table_size 巨细设置成同等,假如不同等,则会按照最小的来起作用,但也不要太小,否则会报错。



四、SQL 查询全过程



如下图所示,SQL 查询效果的全过程。



YOCODQ00bd0BK0dq.jpg


查询缓存
,判定 SQL 语句是否完全匹配,再判定是否有权限,两个判定为假则到剖析器剖析语句,为真则提取数据效果返回给用户;



剖析器剖析:剖析器先词法分析,语法分析,查抄错误好比引号有没闭合等,然后天生剖析树;



预处置惩罚:预处置惩罚办理剖析器无法决解的语义,如查抄表和列是否存在,别名是否有错,天生新的剖析树;



优化器做大量的优化操纵;天生实行筹划;



查询实行引擎,负责调理存储引擎获取相应数据;返回效果。

 

参考资料


http://my.oschina.net/peakfang/blog/2240253

http://dev.mysql.com/doc/refman/5.7/en/innodb-storage-engine.html
张甦 著 《MySQL王者晋级之路》
注:全文均参考以上资料,如侵权接洽可实时删除,若想获取更多,可访问以上链接。


保举阅读:

模仿真实情况下超简朴超具体的 MySQL 5.7 安装

关系型数据库 MySQL 体系布局详解

关系型数据库 MySQL 表相干操纵

Linux 下 CentOS 7 安装教程

MySQL 底子知识学习

周末面基后的碎碎念

十大资源分享篇一



资源分享:

5T 技能资源大放送!包罗但不限于:Linux、Python、Oracle、MySQL、Java、前端、大数据、人工智能等,详细获取方式可关注本公众号大概添加我微信获取~~

fwgg9wSUt7udVd77.jpg e7UT1O9Q1LTbgW6T.jpg
添加微信,可参加资源技能交换群


LMEf40yZMME41Yf0.jpg
长按 辨认二维码 即可关注!
走过途经,不要错过这个 悦目 哦!

Erg3h9aRcGrRtc3y.jpg




上一篇:好消息,开年会员特惠招募,末了几天,时机难过万万不要错过! ...
下一篇:NSA开源逆向工具Ghidra入门利用教程
您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

 

QQ|申请友链|小黑屋|手机版|Hlshell Inc. ( 豫ICP备16002110号-5 )

GMT+8, 2024-4-20 19:14 , Processed in 0.064671 second(s), 47 queries .

HLShell有权修改版权声明内容,如有任何爭議,HLShell將保留最終決定權!

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表