目录
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+树的叶子节点段和非叶子节点段。




&spm=1001.2101.3001.5002&articleId=148594521&d=1&t=3&u=c95d0ecb4da640f8b15783f78641fb8c)
4379

被折叠的 条评论
为什么被折叠?



