MySQL 的数据目录
本章就是要唠叨一下InnoDB和MyISAM这两个存储引擎的数据如何在文件系统中存储的。
数据目录:MySQL服务器程序在启动时会到文件系统的某个目录下加载一些文件,之后在运行过程中产生的数据也都会存储到这个目录下的某些文件中,这个目录就称为数据目录,我们下边就要详细唠唠这个目录下具体都有哪些重要的东西。
数据目录和安装目录的区别
数据目录是用来存储MySQL在运行过程中产生的数据。
数据目录的结构
我们每当我们新建一个数据库时,进行的操作:
-
在
数据目录下创建一个和数据库名同名的子目录 -
在该与数据库名同名的子目录下创建一个名为
db.opt的文件,这个文件中包含了该数据库的各种属性,比方说该数据库的字符集和比较规则是个啥。
我们的数据其实都是以记录的形式插入到表中的,表有:表的结构,表中数据。
InnoDB和MyISAM这两种存储引擎都在数据目录下对应的数据库子目录下创建了一个专门用于描述表结构的文件:表名.frm
系统表空间
独立表空间:InnoDB并不会默认的把各个表的数据存储到系统表空间中,而是为每一个表建立一个独立表空间,也就是说我们创建了多少个表,就有多少个独立表空间。
使用独立表空间来存储表数据的话,会在该表所属数据库对应的子目录下创建一个表示该独立表空间的文件:表名.ibd。
如:test.ibd文件就用来存储test表中的数据和索引。。
test.frm文件就用来描述表结构。。
MyISAM是如何存储表数据的
MyISAM中的索引全部都是二级索引,该存储引擎的数据和索引是分开存放的。(innodb中数据与聚簇索引存放在一起的)。
创建test表就有:
test.frm
test.MYD
test.MYI
test.frm来存放表结构,test.MYD代表表的数据文件,也就是我们插入的用户记录;test.MYI代表表的索引文件,我们为该表创建的索引都会放到这个文件中。
视图在文件系统中的表示
视图其实是虚拟的表,也就是某个查询语句的一个别名而已,所以在存储视图的时候是不需要存储真实的数据的,只需要把它的结构存储起来就行了。只会存储一个视图名.frm

InnoDB的表空间
InnoDB也为了不同的目的设计了若干种不同类型的页面 ,FIL_PAGE_INDEX是存放索引数据的页面类型,即常说的数据页。
一个表空间最多可以拥有2³²个页,如果按照页的默认大小16KB来算,一个表空间最多支持64TB的数据。表空间的第一个页的页号为0,之后的页号分别是1,2,3...依此类推
区(extent)的概念
对于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中InnoDB和MyISAM存储引擎的数据存储方式。InnoDB采用独立表空间,每个表对应一个.ibd文件存储数据和索引,而.Myd和.Myi文件则是MyISAM存储数据和索引的方式。此外,文章还介绍了数据目录的结构、表空间、区、段等概念,以及InnoDB的页类型和空间分配策略。
1181

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



