Mysql的InnoDB内存结构和磁盘结构

InnoDB内存结构

在这里插入图片描述
一、 Buffer Pool 主要分为3 个部分: Buffer Pool、Change Buffer、Adaptive Hash Index,另外还有一个(redo)log buffer

Buffer Pool缓存的是页面信息,包括数据页、索引页。

Change Buffer 写缓冲

如果数据库大部分索引都是非唯一索引,并且业务是写多读少,不会在写数据后立刻读取,就可以使用Change Buffer(写缓冲)。写多读少的业务,调大这个值

SHOW VARIABLES LIKE ‘innodb_change_buffer_max_size’;

代表Change Buffer 占Buffer Pool 的比例,默认25%。

Adaptive Hash Index

redo log的内容主要是用于崩盘恢复。

数据库启动时从这个文件进行恢复操作(实现crash-safe)——用它来实现事务的持久性。

在这里插入图片描述

磁盘结构

系统表空间 system tablespace

默认的系统表空间位置-/var/lib/mysql/ibdata1
在这里插入图片描述
InnoDB系统表空间包含InnoDB Data DictionaryDoublewrite bufferchange BufferUndo logs

  1. undo

  2. 数据字典:由内部系统表组成,存储表和索引的元数据(定义信息)

  3. 双写缓冲-InnoDB的一大特性
    InnoDB页大小一般为16k,操作系统页大小4k,InnoDB的页写入到磁盘一个页需要分4次写。
    在这里插入图片描述
    当页的数据写入到磁盘发生了宕机,可能出现只写如了一部分,这种情况叫部分写失效(partial page write)。
    解决:若这个页本身已损坏,直接redo log恢复是没意义的。所以在redo log前,需要页的副本,如果出现写入失效,就用副本来还原这个页,然后再应用redo log。这个页的副本就是double write,InnoDB的双写技术。实现了数据页的可靠性。

  4. 独占表空间 file-per-table tablespaces
    每张表独占一个表空间。通过innodb_file_per_table 设置,默认开启。

SHOW VARIABLES LIKE ‘innodb_file_per_table’;

该文件放在/var/lib/mysql/wg_sanguo/t_hero.ibd的idb文件,存放表的索引和数据。
在这里插入图片描述

  1. 通用表空间 general tablespaces
    一种共享的表空间,可以创建一个通用的表空间来存储不同数据库的表,数据路径和文件可以自定义。

create tablespace ts2673 add datafile ‘/var/lib/mysql/ts2673.ibd’ file_block_size=16K engine=innodb;

use mysql; --因为放到了mysql目录下 create table t2673(id integer)
tablespace ts2673;

  1. 临时表空间 temporary tablespaces
    存储临时表的数据,包括用户创建的临时表,和磁盘的内部临时表。对应数据目录下的ibtmp1 文件。当数据服务器正常关闭时,该表空间被删除,下次重新产生。
  2. redo log
    磁盘结构里的redo log
  3. undo log tablespace
    undo log(撤销日志或回滚日志)记录了事物发生之前的数据状态(不包括select)。如果修改数据时出现异常,可以用undo log来实现回滚操作(保持原子性)。
    undo log和redo log统称为事务日志。

Binlog

binlog 以事件的形式记录了所有的DDL 和DML 语句(因为它记录的是操作而不是
数据值,属于逻辑日志),可以用来做主从复制和数据恢复。

  • 实现数据的恢复:在开启了binlog 功能的情况下,把binlog 导出成SQL 语句,把所有的操
    作重放一遍.
  • 实现主从复制:从服务器读取主服务器的binlog,然后执行一遍。

总结:更新流程

update user set name = ‘penyuyan’ where id=1;

在这里插入图片描述

  1. 先查询到这条数据,如果有缓存,也会用到缓存。
  2. 把name 改成盆鱼宴,然后调用引擎的API 接口,写入这一行数据到内存,同时记录redo log。这时redo log 进入prepare 状态,然后告诉执行器,执行完成了,可以随时提交。
  3. 执行器收到通知后记录binlog,然后调用存储引擎接口,设置redo log 为commit状态。
  4. 更新完成。

1、先记录到内存,再写日志文件。
2、记录redo log 分为两个阶段。
3、存储引擎和Server 记录不同的日志。
4、先记录redo,再记录binlog。

在这里插入图片描述

PS:DML(Data Manipulation Language)数据操纵语言:

适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等.

DDL(Data Definition Language)数据定义语言:

适用范围:对数据库中的某些对象(例如,database,table)进行管理,如Create,Alter和Drop.

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值