database
每个database都对应数据目录下的文件夹,文件夹的名字与database的名字相同。该目录下有db.opt文件,存储数据库的一些属性,如编码、排序规则等等。
table
表结构
存储着表的结构信息,如列名、列的数据类型、约束条件、索引、字符集、比较规则等。
表结构文件是表名.frm,是一种二进制文件
表数据
使用表空间来存放数据,一个表空间对应一个或多个文件,可以划分为多个页,数据存在这些页中。
- 系统表空间
默认名字为ibdata1,自动扩展大小。可以通过配置文件修改表空间文件位置和名称、初始化大小。
mysql 5.5.7-5.6.5之间的版本的所有的表的数据都存在这个表空间中。
- 独立表空间
mysql5.6.6之后,mysql为每个表创建单独的表空间。文件名为表名.ibd
- 其他表空间
MyISAM
表名.frm为表结构空间
表名.MYD为数据文件
表名.MYI为索引文件
innodb表空间
表空间中的页太多,方便管理,进行分区分组管理。
一个页16K,连续64个页为一个区(1M),256个区为一个组(256M)
表空间的第一个组的最开始的3个页面类型是固定的
| FSP_HDR | 一个表空间只有一个该类型的页,用于登记整个表空间的一些整体属性以及本组所有区的属性 |
|---|---|
| IBUF_BITMAP | 存储关于Change Buffer的一些信息 |
| INODE | 存储许多INODE Entry的数据结构 |
其余各组最开始的2个页面类型是固定的
| XDES | 登记本组256个区的属性 |
|---|---|
| IBUF_BITMAP | 存储关于Change Buffer的一些信息 |
段
如果以页为单位分配存储空间,相邻两页在物理存储上可能相差很远,造成随机IO,因此有了区的概念。
区是连续64个页的集合,在物理位置上是连续的,页号也是连续的。当表数据大时使用区为单位分配存储,能减少很多随机IO。虽然会造成部分空间浪费,但性能提升很高。
同时,对于索引的叶子节点和非叶子节点,使用不同的区存储,作为不同的段。
即一个索引分为两个段:叶子节点段和非叶子节点段。每个段是以区为单位的存储空间。
分开存储的是方便查询,即在索引查询非叶子节点和叶子节点的不同步骤均能最大程度的顺序查询。
碎片区
一个段最小包含两个区,即2M的空间。
对于只存放了几条记录的小表分配2M空间是很浪费的,因此引入碎片区的概念。
碎片区内的页可以属于不同的段,甚至其他目的,其直属于表空间。
表中刚插入数据时,段是在某个碎片区以单个页面为单位分配存储空间,当某个段占用了32个碎片区页面后,后面再分配将以完整区的单位来分配空间,同时之前占用的碎片页保持,不会复制到新区中。
