【MYSQL】一:从操作系统分析innodb引擎架构

5.7

1.三部分架构:上层应用内存空间——OS磁盘高速缓存——磁盘在这里插入图片描述

2.上层应用内存空间

buffer pool:缓冲池

当访问表或者索引信息会被缓存到这里,这样能够把经常访问的信息缓存到这里;每个小块是一个page,以链表的形式管理,另外是立即刷盘,不同log buffer可以控制写入缓存再写入磁盘;选用变种型LRU(最近最少使用)替换算法,page的使用跟JVM的设计有些类似,分代的

  • 以链表的形式管理:使用的page会用链表连接(Database pages ),空闲page也会连起来(Free buffers ),脏page也会用链表连起来(Modified db pages)来管理
  • 变种型LRU,page跟JVM的设计有些类似,分代的,是在新老带中间插入,如果数据很快被访问会往head去移动,不被访问会往tail移动被淘汰。先去空闲链表分配,分配完删除,加入到使用链表。链表适合增删,所以使用链表可以O(1)级别在年轻与老年代移动
    在这里插入图片描述
show engine innodb status

Buffer pool size   512
Free buffers       249
Database pages     256
Old database pages 0
Modified db pages  0

Change Buffer:写缓冲区

对非唯一普通索引的 INSERT, UPDATE,or DELETE operations (DML)会导致Change Buffer变化,主键与unique索引无法使用。
更新一条记录的话,如果在pool buffer中存在直接在pool buffer中修改完成;如果pool buffer没有,就会在change buffer中记录完成。两种都不需要磁盘操作。如果下次查询改记录,会先去磁盘读取,然后再从change buffer中合并,最后写入buffer pool

log buffer :日志缓冲区,保存写入磁盘的日志信息,有redo undo 等,有刷盘操作会进行刷盘

右边:磁盘结构

daptive Hash Index:自适应hash索引

对buffer pool优化,监控对索引使用情况,频繁使用就建立hash索引来寻找

Log Buffer

DML操作会产生redo,undo日志,logbuffer会根据刷盘策略来写盘

innodb_log_buffer_size variable.:The default size is 16MB
innodb_flush_log_at_trx_commit:variable controls how the contents of the log buffer are written and flushed to disk,注:这里written是写入OS高速磁盘高速缓存,flush是由缓存写入磁盘,0每隔1s written +flushed ,1事务完成 written +flushed ,2事务完成written 1s 后flushed
innodb_flush_log_at_timeout:variable controls log flushing frequency.

3. 磁盘

system tablespace:系统表空间

innodb数据字典,undo buffer;被多表共享

Doublewrite Buffer: 存储缓冲池中flush的page,以免在flush时操作系统,存储系统,mysqld进程的意外发生,重启后可以找到很好的备份;两次写数据,但不需要花费两次IO查找

File-Per-Table Tablespaces:我们经常用的

默认开启,不开启就创建就会放在系统表空间,即ibdata1文件中,而开启就会没创建都会生成自己的ibd文件

mysql> SET GLOBAL innodb_file_per_table=ON;
mysql> USE test;
mysql> CREATE TABLE t1 (
 id INT PRIMARY KEY AUTO_INCREMENT,
 name VARCHAR(100)
 ) ENGINE = InnoDB;
shell> cd /path/to/mysql/data/test
shell> ls
t1.ibd

General Tablespaces:可以在其他目录创建,避免与隐式创建的File-Per-Table Tablespaces冲突

mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;
mysql> CREATE TABLESPACE `ts1` ADD DATAFILE '/my/tablespace/directory/ts1.ibd' Engine=InnoDB;

Undo Tablespaces:撤销表空间,有一组undo文件构成

Temporary Tablespace:全局与当前临时表空间

4. 数据存储格式

.frm存储定义,.ibd存储数据与索引

8.0

在这里插入图片描述

  1. 双写剥离
  2. system undo与undo合并,分为系统undo 与用户自定义
  3. temporary tablespaces 全局与局部拆分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yilyil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值