本章就是要唠叨一下InnoDB
和MyISAM
这两个存储引擎的数据如何在文件系统中存储的。
数据目录:MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为数据目录
,我们下边就要详细唠唠这个目录下具体都有哪些重要的东西。
数据目录
是用来存储MySQL
在运行过程中产生的数据。
我们每当我们新建一个数据库时,进行的操作:
在数据目录
下创建一个和数据库名同名的子目录
在该与数据库名同名的子目录下创建一个名为db.opt
的文件,这个文件中包含了该数据库的各种属性,比方说该数据库的字符集和比较规则是个啥。
我们的数据其实都是以记录的形式插入到表中的,表有:表的结构,表中数据。
InnoDB
和MyISAM
这两种存储引擎都在数据目录
下对应的数据库子目录下创建了一个专门用于描述表结构的文件:表名.frm
系统表空间
独立表空间:InnoDB
并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。
使用独立表空间
来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间
的文件:表名.ibd。
如:test.ibd
文件就用来存储test
表中的数据和索引。。
test.frm文件就用来描述表结构。。
MyISAM
中的索引全部都是二级索引,
该存储引擎的数据和索引是分开存放的。(innodb中数据与聚簇索引存放在一起的)。
创建test表就有:
test.frm
test.MYD
test.MYI
test.frm来存放表结构,test.MYD
代表表的数据文件,也就是我们插入的用户记录;test.MYI
代表表的索引文件,我们为该表创建的索引都会放到这个文件中。
视图其实是虚拟的表,也就是某个查询语句的一个别名而已,所以在存储视图
的时候是不需要存储真实的数据的,只需要把它的结构存储起来就行了。只会存储一个视图名.frm
InnoDB也为了不同的目的设计了若干种不同类型的页面 ,FIL_PAGE_INDEX是存放索引数据的页面类型,即常说的数据页。
一个表空间最多可以拥有2³²个页,如果按照页的默认大小16KB来算,一个表空间最多支持64TB的数据。表空间的第一个页的页号为0,之后的页号分别是1,2,3...依此类推
对于16KB的页来说,连续的64个页就是一个区
,也就是说一个区默认占用1MB空间大小。
页x64---->区x256---->组
存放叶子节点的区的集合就算是一个段
(segment
),存放非叶子节点的区的集合也算是一个段
。也就是说一个索引会生成2个段,一个叶子节点段,一个非叶子节点段。
在刚开始向表中插入数据的时候,段是从某个碎片区以单个页面为单位来分配存储空间的。
当某个段已经占用了32个碎片区页面之后,就会以完整的区为单位来分配存储空间
每一个区都对应着一个XDES Entry
结构,这个结构记录了对应的区的一些属性
每个段中的区对应的XDES Entry
结构建立了三个链表:
FREE
链表:同一个段中,所有页面都是空闲的区对应的XDES Entry
结构会被加入到这个链表。注意和直属于表空间的FREE
链表区别开了,此处的FREE
链表是附属于某个段的。
NOT_FULL
链表:同一个段中,仍有空闲空间的区对应的XDES Entry
结构会被加入到这个链表。
FULL
链表:同一个段中,已经没有空闲空间的区对应的XDES Entry
结构会被加入到这个链表。
每一个索引都对应两个段,每个段都会维护上述的3个链表。
每个链表都对应一个List Base Node
的结构,这个结构里记录了链表的头、尾节点的位置以及该链表中包含的节点数
每个段都定义了一个INODE Entry
结构来记录一下段中的属性。
FSP_HDR
类型 FSP_HDR
,它存储了表空间的一些整体属性以及第一个组内256个区的对应的XDES Entry
结构
mysql基于表空间的插入流程 | ProcessOn免费在线作图,在线流程图,在线思维导图 |