独立表空间&系统表空间总结---innoDB表空间(三十五)

简介: 独立表空间&系统表空间总结---innoDB表空间(三十五)

上篇文章说了系统表空间的data dictionary header:

Data dictionary header(2) --系统表空间结构(三十四)

前面我们说了独立表空间和系统表空间:


独立表空间:


当在建立表的时候,在文件系统空间会生成同名的目录或者文件,一个页有16kb,我们都知道查询是通过b+树查找的,但如果数据太多,页之前又是通过双向链表查询的,物理空间不在一起,这时候查询就是随机I/O,为了两个页查询的距离不是很远,所以又有区的概念,64个页分为一个区,而256个区又分为一个组,所以当一个新表插入数据的时候,是根据区来插入的,区又属于段下面。

这时候就会问,如果新表的数据很少,根据区来划分不是很浪费空间吗,所以这时候innodb引入了碎片区的概念,当区存满32个的时候,才会升级属于特有的段,所以段里存放的是完全的区或者碎片区,区里面都是由extent descritor entry简称xdes entry管理,里面有四个链表,free,free_frag,full_frag,fseg四个链表,所以innoDB每次存入数据并不是遍历表空间里的数据,而是直接看free_frag链表是否有值,没有的话就是free链表申请,吧free链表升级为free_frag链表,当free_frag里的descritor entry已经没有空闲的数据页时候,就把这个xdes entry移动到full_frag里面,当有32个完整区时候 ,会吧区划分到属于他的段。

那怎么知道他属于什么段呢,因为xdes entry里面有segment id,用段id划分肯定是不行的,因为当前段里肯定有没有存满的碎片区,如果按full_frag肯定也不行,这个链表里面的数据是属于不同的段,不可能吧里面所有的数据都划分到同一个段。

所以fseg链表又分为三个链表,段的free链表,not_full链表,和full链表,当数据存满的时候先看看not_full链表是否可以继续存储数据,不可以就去段的free链表申请,当满了就放进full链表。

叶子节点和非叶子节点又分为不同的段,一个表中,如果有聚簇索引和二级索引,一个索引会生成两个段,两个索引有四个段,四个段有12个链表,再加上表空间直属的三个链表,free,free_frag,full_frag,所以会有15个链表。

段里面管理段的是inode entry,里面和区的xdes entry类似,有三个链表free,not_full,和full。

区的名称又分为extent0,extent1等等,而 extent0第一页叫FSP,以后的区空间第一页都叫xdes 类型页面管理者 xdes entry,而fsp和xdes类似,存放着xdes 的各种链表,一共4个,但多了几个表空间特有的属性 。

比如file space header,这个是重点,放着表空间直属管理的东西,比如多少个页面,初始化前后的值等,还存着区链表的基点和段链表的基点,方便后面查找。

Fsp里面还有一个inode类型页,里面放啥前面都说过了,分别有着三个链表。


系统表空间:


系统表空间总体来说和独立表空间类似,但系统表空间存着系统特有的页面,是表空间之首,space id为0。

着重介绍data dictionary header,这里面有什么呢,都是全局的唯一id自增数据,当index,table,space,row_id等新增的时候,都是在这里取值,然后在吧这里的最大值加1。

还存放着系统表数据,sys_tables,sys_cloums,sys_indexes,sys_fileds。

innoDB有这四个字典表,基本所有的数据都能获取到,通过表名在tables里获取到tableid,通过tableid可以从colums获取到表列的数据,从indexes获取到index id,通过index id可以从fileds获取到索引列的信息。

而这些数据是不能直接访问的,mysql为了方便我们排查错误,给了innodDB_sys类型的表,可以在information_schema里查询这些数据方便排查问题。


相关文章
|
存储 关系型数据库 MySQL
第9章 【MySQL】InnoDB的表空间
第9章 【MySQL】InnoDB的表空间
103 0
第9章 【MySQL】InnoDB的表空间
|
8天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的表空间
InnoDB是MySQL默认的存储引擎,主要由存储结构、内存结构和线程结构组成。其存储结构分为逻辑和物理两部分,逻辑存储结构包括表空间、段、区和页。表空间是InnoDB逻辑结构的最高层,所有数据都存放在其中。默认情况下,InnoDB有一个共享表空间ibdata1,用于存放撤销信息、系统事务信息等。启用参数`innodb_file_per_table`后,每张表的数据可以单独存放在一个表空间内,但撤销信息等仍存放在共享表空间中。
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
MySQL数据库——InnoDB引擎-逻辑存储结构(表空间、段、区、页、行)
108 7
|
6月前
|
存储 关系型数据库 MySQL
认真学习InnoDB的数据存储结构中的区、段与表空间
认真学习InnoDB的数据存储结构中的区、段与表空间
128 2
|
关系型数据库 数据库
Innodb表空间迁移
有cfg文件时表空间迁移 在源表上显示建表语句:
|
存储 关系型数据库 MySQL
一文带你了解MySQL之InnoDB表空间
通过前边的内容,相信大家都知道了表空间是一个抽象的概念,对于系统表空间来说,对应着文件系统中一个或多个实际文件;对于每个独立表空间来说,对应着文件系统中一个名为表名.ibd的实际文件。 大家可以把表空间想象成被切分为许多个页的池子,当我们想为某个表插入一条记录的时候,就从池子中捞出一个对应的页来把数据写进去。 本章内容会深入到表空间的各个细节中,带领大家在InnoDB存储结构的池子中畅游。由于本章中将会涉及比较多的概念,虽然这些概念都不难,但是却相互依赖,所以奉劝大家看的时候:不要跳着看
253 0
|
存储 关系型数据库 MySQL
一文带你了解MySQL之InnoDB表空间
通过前边的内容,相信大家都知道了表空间是一个抽象的概念,对于系统表空间来说,对应着文件系统中一个或多个实际文件;对于每个独立表空间来说,对应着文件系统中一个名为表名.ibd的实际文件。 大家可以把表空间想象成被切分为许多个页的池子,当我们想为某个表插入一条记录的时候,就从池子中捞出一个对应的页来把数据写进去。 本章内容会深入到表空间的各个细节中,带领大家在InnoDB存储结构的池子中畅游。由于本章中将会涉及比较多的概念,虽然这些概念都不难,但是却相互依赖,所以奉劝大家看的时候:不要跳着看
236 0
|
存储 关系型数据库 MySQL
InnoDB 独立表空间与共享表空间
InnoDB 独立表空间与共享表空间
113 0
InnoDB 独立表空间与共享表空间
|
关系型数据库 MySQL
InnoDB系统表空间定义规则
1. InnoDB系统表空间定义规则 2. 并行复制设置不当可能导致主从数据不一致
|
8天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
114 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件