直接拿下MySql--深入InnoDB篇(进阶版)

逻辑存储结构

c74f3de0af3a4757a103906a50b6d094.jpg

 

 架构

内存架构:

266b33a123ec456599d7fa8b4624f798.jpg

e053c5ef7f814974a4a0c2eb58c670b7.jpg

ff0dc549a9c84a6a90bcb62aa4f5f2e9.jpg

b9eff67383f44612995f3057c6a166c6.jpg 

 磁盘架构:

f20afef6a8134b9cad93f39c79f3f6aa.jpg

806dc6329e2842ca8e698804569a7d6f.jpg

776857c09dca4ccc8b50a60594815b42.jpg 

 事务原理(ACID的实现原理)

f660a0cb1986485daaaefb4a8c894705.jpg

 

首先来看ACID中的D--持久性是如何实现的

8d222b2d7101462ebff1ec86f108cb2d.jpg

 当开启一个事务并且在事务中进行了更新操作,数据库会首先在Buffer Pool缓冲池中查找是否有这条数据,如果没有则去磁盘中拿出来然后在进行修改,当事务提交之后,Buffer Pool中的脏页就会被随机写到磁盘中,如果此时数据库挂掉,就导致事务失败

8dc5ecf010664abb9cba4d09f07e0f89.jpg

b11518d7db2b49baae5a1470c0b247b3.jpg

 因此我们就要使用redo_log,除了对缓冲池的修改,还会把操作追加到redo_log中,事务提交后将其刷新到磁盘上,以保证数据的更改成功

 

接下来看ACID中的A--原子性是如何实现的

46d0655df24d4a6d9b5439af8d9e9e2f.jpg

 

 

MVCC机制--多版本并发控制

先了解什么是当前读和快照读

        当前读:  像 select lock in share mode (共享锁), select for update; update; insert; delete (排他锁)这些操作都是一种当前读,为什么叫当前读?就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁

        快照读:  像不加锁的 select 操作就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即 MVCC ,可以认为 MVCC 是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本,所以开始学MVCC!

 

①首先我们要来了解innodb的三个隐藏字段

7f2a63eb37c243cb8dc91cb947320f00.jpg

 trx_id: 最后一次修改该记录的事务ID

roll_ptr:回滚指针,指向这条记录的上一个版本

row_id: 隐式主键,如果没有创建主键,就会生成

 

②其次我们还要知道undo_log日志以及undo_log的版本链

381c2de487a14d42a8bd8ebd163f5a7c.jpg

3bd9bfcac7a64f28ac4eb78e6471a6f4.jpg

undo_log中会记录数据的上一个版本,每次修改首先将原数据记录到undo_log中,然后再更新数据,包括trx_id:记录该事务id和roll_ptr:指向上一个版本的指针。

 

③最后我们还要知道一个工具:readview

主要是用来判断你快照读读的到底是哪个版本

e91b6c856e3d4979981834314e58e709.jpg

首先读视图readview生成的方式有所不同,在RC级别下,每一次的快照读都会生成一个readview。而在RR级别下只会在第一次快照读的时候生成,然后其他的快照读共享这一个readview

 

其次就是判断快照读读哪个版本。我们要将当前数据的trx_id(最后一次事务的id)去比对看是否可以读,如果不可以就跟着undo_log链通过roll_ptr指针往下找,直到找到可以读的那条数据

28dadff88002491d9871f48541b4011f.jpg

 

最后就是ACID中的C-一致性和I-隔离性是如何实现的

a037991e4fae421fbcda1c04081f44a4.jpg

 

所有的MySql的学习就到此结束!!!!

 

 

 

  • 20
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值