首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
数据库
›
SQL-Server
›
InnoDB引擎
返回列表
发新帖
InnoDB引擎
[复制链接]
发表于 2025-9-5 14:51:44
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
逻辑
存储
结构
表空间(ibd文件),一个MySQL实例可以对应多个表空间,用
存储
记载,索引等数据。
段,分为数据段,索引段,回滚段,InnoDB是索引组织表,数据段就是b+树的叶子结点,索引段即为b+树的非叶子结点,段用来管理多个extent(区)。
区,表空间的单位结构,每个区的大小为1m。默认情况下,InnoDB
存储
引擎页的大小为16k,即一个区中一共有64个一连的页。
页,是InnoDB存储引擎磁盘管理的最小单位,每个页的大小默认为16kb,为了保证页的一连性,InnoDB存储引擎每次从磁盘申请4-5个区。
行,InnoDB存储引擎数据是按行举行存放的。
trx_id:每次对某条记载举行改动时,都会把对应的变乱id赋值给trx_id隐藏列。
Roll_pointer:每次对某条记载举行改动时,都会把旧的
版本
写入到undo日记中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记载修改之前的信息。
架构:
·内存结构:
Buffer Pool:缓存池是主内存中的一个地域,里面记载着缓存磁盘上经常操作的真实的数据,当实行增删改查操作的时候,会先从缓存池当中举行数据的操作,这样可以有效的减少对磁盘IO的直接操作,有效加速速度,当操作之后再以一定的时间频率刷新到磁盘当中。
缓存池当中以page为单位,底层采用链表数据管理page,根据状态将page分为三种种类:
free page:体现还未被利用。
clean page:体现被利用的page,数据还没有被修改过。
dirty page:脏页,被利用page,数据被修改过,其中数据与磁盘的数据产生了不同等。
change Buffer:更改缓冲区(针对非唯一的二级索引),在实行DML语句时,假如这些数据page没有在Buffer Pool中,不会直接操作磁盘,而会将数据变更更改在change Buffer中,在数据被读取时,再将数据合并恢复到Buffer Pool当中,再将合并后的数据刷新到磁盘中。
change Buffer的存在意义
:
二级索引与聚集索引不同,二级索引通常是非唯一的,而且以相对随机的顺序插入二级索引,同样,
删除和更新可能会影响索引数中不相邻的二级索引页
,如图所示,假如说没有change Buffer的话,每一次操作都会直接对二级索引树举行更新操作,假如每一次都操作磁盘,会造成大量的磁盘IO。有了Change Buffer之后,我们可以在缓冲池中举行合并处理,减少磁盘IO。
Adaptive Hash Index:自适应hash索引,用于优化Buffer Pool数据的查询,在InnoDB存储引擎会
监控
对表的查询,当观察到hash索引可以提高服从的时候,会自动举行开启,创建hash索引查询。
Log Buffer :日记缓冲区,用来保存磁盘当中的log日记,默认为16mb,日记缓冲区的日记会定期刷新到磁盘当中,假如需要更新,插入大概删除等很多变乱,增加日记缓冲区的大小,可以有效节省磁盘IO。
参数: innodb_log_size:缓冲区大小。
innodb_flush_log_at_trx_commit:日记刷新到磁盘的时机。
1代表每次失误提交时写入并刷新到磁盘,
0代表日记每次秒写入并刷新到磁盘。
2代表每次变乱提交之后写入,并每秒刷新到磁盘一次。
磁盘结构:
system Tablespace: 系统表空间是更改缓冲区的存储地域,假如表是在系统表空间而不是每个表文件或通用表空间中创建的,它也可能包罗表和索引数据。
file-per-table Tablespaces:每个表的文件表空间包罗单个InnoDB表的数据和索引,并存储在文件系统上的单个数据文件中。
General Tablespaces:通用表空间,需要通过CREATE TABLESPACES 语法创建通用表空间,在创建表时,可以指定该表空间,该表空间,需要用户自己设置,不然不会产生。
undo Tablespaces:撤销表空间,MySQL实例在初始化时自动创建两个默认的undo表空间,用于存储undo log日记。
temporary tablespaces:inooDB利用暂时会话暂时表空间和全局暂时表空间,存储用户创建的暂时表等数据。
Doublewrite Buffer Files:双写缓冲区,当在内存结构当中的Buffer log当中举行数据的刷新的时候,会先将其操作写入双写缓冲区,防止系统异常时恢复数据。 文件以.dblwr
Redo Log:重做日记,该日记分为两个部分,重做日记缓冲区(redo log buffer)以及重做日记文件(redo log),前者实在内存当中,后者是在磁盘当中,当变乱提交之后会把所有的修改信息都存入到该日记当中,当刷新磁盘的时候,出现错误,方便数据的恢复。文件ib_logfile0和ib_logfile1。
后台线程:
后台线程:
后台线程的作用就是在合适的时机在将内存区的数据刷新到磁盘区
后台线程重要分以下四类:
Master Thread
核心后台线程,负责调度其他线程,还负责将缓冲池中的数据异步刷新到磁盘当中,保持数据的同等性,还包括脏页的刷新,合并插入缓存,undo页的接纳。
IO Thread
在InnoDB存储引擎中大量利用AIO来处理IO请求,这样可以极大的提高
数据库
的
性能
,而IO Thread重要负责这些IO的请求。
Purge Thread
重要用于接纳变乱已经提交的undo log,在变乱提交之后,undo log可能不消了,就对其举行接纳。
Page Cleaner Thread
协助Master Thread举行刷新以及脏页到磁盘的线程,它可以减轻Master Thread的工作压力,减少阻塞。
变乱原理
变乱是一组操作的聚集,它是一个不可分割的聚集,将操作举行同时提交大概撤销,要么变乱同时成功,要么同时失败。
redo log:重做日记,记载的是变乱在提交数据页的物理修改,用来保证变乱的长期性。redo log分为两部分重做日记缓冲区(redo log buffer)和重做日记文件(redo log file),前者在内存当中,后者在磁盘当中。
redo log buffer:存在于内存结构当中,在缓冲池当中的变乱举行提交,脏页开始同步磁盘之前,会记载下数据页的操作变革(redo log buffer),然后就会通过WAL机制,先行日记磁盘结构的(redo log file)生成文件。保证在脏页举行更新的情况下数据的长期化。
undo log:用以解决变乱的原子性,它被用于记载数据被修改之前的信息,作用包罗有提供回滚和MVCC(多
版本
并发控制)
undo log和redo log的记载物理日记不一样,undo log记载的是逻辑日记,记载的是数据实行之前的操作语句。
undo log销毁:undo log在变乱实行时产生,当变乱提交时,并不会立即删除,这些日记用来检查是否还用于MVCC。
undo log存储:undo log采用段的方式举行管理和记载,存放在前面的回滚段之中。
MVCC
当前读:
读取的是记载的最新
版本
,读取是还要保证其他并发变乱不能修改当前的记载,会对读取的记载举行加锁。select ... lock in share mode(共享锁),select .. for update、update、insert、delete(排他锁)都是一种当前读。
快照读:
简单的select语句就是快照读,快照读,读取的是记载数据的可见版本,有可能是汗青数据,是非阻塞读。
Read Committed:每次select,都生成一个快照。
Repeatable Read:开启变乱后第一个select语句就是快照读的地方。
Serializable:快照读会退化为当前读。
MVCC:
全程Multi-Version Concurrency Control,多版本并发控制,指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个非阻塞度
功能
。MVCC的具体实现,还需要依靠于
数据库
记载中的三个隐式字段,undo log日记,readView。
记载当中的隐藏字段
DB_TRX_ID:近来修改变乱的ID,记载着插入这条记载或修改改记载的变乱ID
DB_ROLL_PTR:回滚指针,指向这条记载的上一个版本,用于配合undo log,指向上一个版本。
DB_ROW_ID:隐藏主键,假如表结构没有主键,将会生成该隐藏字段。
undo log日记:
undo log日记当实行insert时,产生undo log日记只在回滚时需要,在变乱提交后,可被立即删除。
在update,delete的时候,产生的undo log日记不但在回滚时需要,在快照的时候也需要。
undo log版本链
不同变乱或雷同变乱对同一条记载举行修改,会导致该记载的undo log生成一条版本链表,链表的头部是最新的旧记载,链表的尾部是最早的旧记载。
readView
快照读sql实行时MVCC提供数据的依据,记载并维护系统当前活泼的变乱id.
四个核心字段:
不同的隔离级别,生成Readview的时机不同 READ COMMITTED :在变乱中每一次实行快照读时生成ReadView。 REPEATABLE READ:仅在变乱中第一次实行快照读时生成ReadView,后续复用该ReadView。
上图为在RC隔离级别下的MVCC的实现readview的快照读的示意。
在RR的隔离条件下,RR相较于RC解决了可重复读的问题,所以不难想出,具体的套用规则和RC是一样的。
原子性:undo log
长期性:redo log
同等性:undo log+redo log
隔离性:锁+MVCC
回复
使用道具
举报
返回列表
浏览过的版块
物联网
移动端开发
分布式数据库
数据仓库与分析
Java
Oracle
SAP
linux
人工智能
张春
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表