MySQL:InnoDB存储引擎(存储结构篇)

目录

1.MySQL架构图

2.InnoDB的存储结构

2.1表空间

2.2用户数据在表空间的存储

2.2.1为什么使用16KB作为IO基本单位?

2.3页

2.4区

区提升页的访问效率的三种情况

区如何避免空间浪费的?

2.5区组

2.6段


1.MySQL架构图

本文研究的是innodb的存储结构,所以聚焦于架构图的右侧磁盘架构。

2.InnoDB的存储结构

众所周知,mysql创建create database的操作,就是在/var/lib/mysql 下新建一个目录,创建一个表就是在数据目录下创建一个文件,Innodb存储引擎的表空间文件是. idb结尾的。

2.1表空间

表空间就是用来存储表中数据的文件。

表空间可以分为5类,系统表空间,独立表空间,公共表空间,撤销表空间,临时表空间。

2.2用户数据在表空间的存储

为了方便管理表空间的数据,表空间由段,区组,区,页,数据行组成。

页是Innodb引擎与系统IO的最小单位,默认大小是16KB,可以使用innodb_page_size 系统变量进行设置。

注意:innodb_page_size的大小一定是4Kb的整数倍,保证磁盘与系统io数据的完成性,不被分割和浪费。

2.2.1为什么使用16KB作为IO基本单位?

首先我们明确一点,磁盘Io一定是非常低效的,因为磁盘Io是机械运动。

如果使用4kb,一定会产生更多次数的磁盘IO。

根据空间局部性原理,将来要⽤到的信息⼤概率与正在使⽤的信息在空间地址上是临近的。

2.3页

页也是有不同的类型的如索引页和数据页,但是无论哪种页都会有页头,页尾和数据行。

不同的页在磁盘的位置不一定是连续的,一旦跨页访问会涉及到磁盘的随机访问,磁盘是通过摆动磁头来进行随机访问,机械运动效率低。所以引入区的来提高跨页访问的效率

2.4区

区是用来管理页的数据结构,区的大小是1MB可以管理64个页,如果跨页读取,那么页大概率是相近的,可以减少磁头的摆动,如果一个页被频繁的访问,那么整个区都会读取到内存当中,减少IO次数。

区提升页的访问效率的三种情况

1.不跨区访问,页在区内是连续的

磁盘顺序IO,大大减少了磁头摆动。

2.不跨区访问,页在区内是不连续的

页在区内位置是临界,也可以减少磁头的摆动,也可以提升效率。

3.跨区访问

不能提升效率。

区如何避免空间浪费的?

一个区大小是1MB,如果只有很小的数据,那不是浪费空间吗?

在创建表的时候,因为不知道数据的量级,为了节省空间只会创建7个零散页放到碎片区中,随着数据量的增大,会在碎片区不断创建新的页,当页的数量达到32个的时候,后续每次申请都会申请一个完整的区空间。

2.5区组

区组是用来管理区的,每个区组管理256个区并用双向链表连接,区组内首个区的前两个页是用来存储区组条目信息和changeBuffer相关信息。

区组也可以提高跨区访问的速度,具体策略与区提高页的跨区访问速度相同。

2.6段

段并不是表空间的连续的物理空间,段是一种逻辑结构,更像是一种标识用于区分B+树的叶子节点段和非叶子节点段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值