建设工程信息服务平台新网站,wordpress建站seo好做吗,wordpress搬到谷歌服务器,网站建设维护兼职1. 数据目录
在Ubuntu下#xff0c;MySQL的数据目录为/var/lib/mysql
1.1 数据库在文件系统中的表示
#xff08;1#xff09;创建数据库时#xff0c;会在数据目录下创建一个与数据库名同名的子目录。#xff08;除了information_schema这个系统数据外#xff09;
MySQL的数据目录为/var/lib/mysql
1.1 数据库在文件系统中的表示
1创建数据库时会在数据目录下创建一个与数据库名同名的子目录。除了information_schema这个系统数据外
2db.opt文件存储数据库的一些属性
MySQL 8.0 之后不再提供
1.2 表在文件系统中的表示
1表结构定义。表名.frm文件
2表数据
1.2.1 InnoDB
1系统表空间。只有一份默认为数据目录下的ibdata1文件
2独立表空间表名.ibd文件。 MySQL 8.0将ibd文件和frm文件合并只有一个ibd文件并且不再提供db.opt文件其中的字符集、比较规则信息也放在ibd文件中。 存储到系统表空间中的表转移到独立表空间 ALTER TABLE 表名 TABLESPACE innodb_system 存储在独立表空间中的表转移到系统表空间 ALTER TABLE 表名 TABLESPACE innodb_file_per_table 1.2.2 MyISAM
表名.MYD、表名.MYI分别表示表的数据文件和索引文件
2. InnoDB的表空间
2.1 页面通用部分
每个页都包含了File Header和File Trailer
1FIL_PAGE_OFFSET表空间下描述页号4字节因此一个表空间最多 64TB即 (2^32)*16KB
2FIL_PAGE_PREV 和 FIL_PAGE_NEXT 上/下页的页号主要是数据页INDEX 类型使用。
3FIL_PAGE_TYPE据此区分页的类型
2.2 独立表空间结构
表空间划分为一个一个的区每个 1 MB每 256 个区组成一个组。 1第一个组最开始的 3 个页面的类型是固定的。
FSP_HDR整个表空间中只有一个 FSP_HDR 类型的页面登记表空间的一些整体属性和本组索引的区。
File Space Header共 112 字节Space ID4表空间 IDNot Used4未使用可忽略Size4拥有的页面数FREE Limit4尚未被初始化的最小页号该字段表示页号之后的区都未被使用且没有加入到 FREE 链表中Space Flags4页面大小是否为共享/临时表空间等属性FRAG_N_USED4FREE_FRAG 链表中已使用的页面数量List Base Node for FREE list16FREE 链表基节点List Base Node for FREE_FRAG list16FREE_FRAG 链表基节点List Base Node for FULL_FRAG list16FULL_FRAG 链表基节点Next Unused Segment ID8当前表空间中下一个未使用的 Segment ID递增List Base Node for SEG_INODES_FULL list16SEG_INODES_FULL 链表基节点List Base Node for SEG_INODES_FREE list16SEG_INODES_FREE 链表基节点
INODE存储 INODE Entry 数据结构
每个段对应的 INODE Entry 结构会存储到 INODE 页中。段特别多的情况下。会有多个 INODE 页会组成链表。
SEG_INODES_FULL 在该链表中的 INODE 页没有空闲空间 SEG_INODES_FREE 有空闲空间 如果新建一个段时SEG_INODES_FREE 链表为空需要从表空间的 FREE_FRAG链表申请一个页面并把页面的类型修改为 INODE。
2其余各组最开始的 2 个页面的类型是固定的。
XDES登记本组 256 个区的属性。
2.2.1 段
一些零散页面以及一些完整区的集合
1为什么使用区
一个区是连续的 64 页。在表中数据量很大时为某个索引分配空间按照区为单位这样就尽量让页面链表中相邻的页的物理位置也相邻。
2对 B 树的叶子节点和非叶子节点进行了区分。会生成一个叶子节点段和一个非叶子节点段一个索引会生成两个段段是以区为单位申请存储空间的
3以区为单位申请空间对小表会造成浪费存储空间提出了碎片区
碎片区只需于表空间不属于任何段。
碎片区中的页可以用于不同的目的可以属于不同段。
在刚开始向表中插入数据时段是从碎片区的以页为单位分配存储空间的当某个段已经占用了 32 个碎片区页面后就会以区为单位来分配。原先占用的碎片区的页面不会被复制到新申请的区中
2.2.2 区
区可分为 4 种类型这也是 4 种状态State
FREE空闲的区FREE_FRAG有剩余空间页面的碎片区FULL_FRAG没有剩余空间页面的碎片区FSEG附属于某个段的区
前三种是独立的直属于表空间
1为了方便管理区设计每个区都对应一个 XDES Entry 的结构40 字节。
Segment ID 8 字节段的 ID前提是分配给了某个段。List Node 12 字节 指向 前/后一个 XDES Entry 的指针 Page Number OffsetState4 字节Page State Bitmap16 字节每个区有 64 页每页用 2 位表示表明对应的页是否是空闲。
2之所以 XDES Entry 要组成链表是因为可以把状态分别为 FREE、FREE_FRAG、FULL_FRAG 的区对应的 XDES Entry 结构连接成一个 FREE、FREE_FRAG、FULL_FRAG 链表。
段中数据较少时首先查看表空间中是否有状态为 FREE_FRAG 的区如果有则从该区中取下一个零散页把数据插进去否则到表空间中申请一个状态为 FREE 的区把该区的状态变为 FREE_FRAG 然后从该区中取出一个零散页把数据插入进去。
该区中没有空闲页面后将其状态变成 FULL_FRAG。
3段中数据已经占满了 32 个零散的页后申请完整的区。
根据段号来区分各个段对每个段都建立 3 个链表
FREE 链表所有页面都是空闲的区NOT_FULL 链表仍有空闲页面的区FULL 链表已经没有空闲页面的区
4链表基节点
每个链表对应一个 List Base Node 结构16字节
List Length表明链表一共有多少个节点First Node Page该链表的头结点在表空间中的位置Last Node Page该链表的尾结点在表空间中的位置
2.2.3 段的结构
为每个段定义一个 INODE Entry 结构。
Segment ID对应的段的编号NOT_FULL_N_USED在 NOT_FULL 链表中已经使用了多少个页面3 个 List Base Node分别为 FREE、NOT_FULL 、FULL 链表基节点Magic NumberFragment Array Entry共有 32 个每个 Fragment Array Entry 结构对应一个零散的页面这个结构一共 4 字节表示一个零散页面的页号。
2.2.4 Segment Header
1索引会对应两个段如何知道某个索引和某个段之间的对应关系
在数据页的 Page Header 中属性 PAGE_BTR_SEG_LEAF 和 PAGE_BTR_SEG_TOP 仅在 B 树的根页中定义分别记录了叶子/非叶节点段的头部信息Segment Header其中包含表空间ID页面号偏移量
2.3 系统表空间
整个 MySQL 进程只有一个系统表空间其表空间 ID 为 0。 页号页面类型描述3SYS存储 Change Buffer 的头部信息4INDEX存储 Change Buffer 的根页面5TRX_SYS事务相关信息6SYS第一个回滚段信息7SYS数据字典头部信息
extent 1 和 extent 2 这两个区是作为 Doublewrite Buffer
2.3.1 数据字典
由系统表来记录一些元数据某个表中有多少列该表有哪些索引等信息。这些系统表被称为数据字典都是以 B 树的形式保存在系统表空间的某些页面中。
以下四个为基本系统表 1SYS_TABLES整个 InnoDB 存储引擎中所有表的信息
列名描述NAME表名IDTABLE_ID表的 ID每个表具有唯一的 IDN_COLS表中列的个数TYPE类型记录文件格式、行格式、压缩等信息MIX_ID忽略MIX_LEN额外属性CLUSTER_ID忽略SPACE所属表空间的 ID
以 NAME 列为主键的聚簇索引 以 ID 列建立的二级索引
2SYS_COLUMNS所有列的信息。
列名描述TABLE_ID该列所属表的 IDPOS表明是第几列NAME列名MTYPE列的数据类型INT、CHAR等PRTYPE精确数据类型修饰主数据类型的例如是否允许 NULL 等LEN该列最多占用的字节数PREC精度默认为 0
以 TABLE_ID POS列为主键的聚簇索引
3SYS_INDEXES所有索引的信息。
列名描述TABLE_ID该索引所属表的 IDIDINDEX_ID索引 IDNAME索引名N_FIELDS索引包含几列TYPE索引类型例如聚簇索引、唯一二级索引、更改缓冲区的索引、全文索引、普通二级索引SPACE索引根页面所在的表空间 IDPAGE_NO索引根页面所在的页面号MERGE_THRESHOLD指明 B 树发生合并时的比例页面满发生分裂数据太少发生合并
以 TABLE_ID ID列为主键的聚簇索引
4SYS_FIELDS索引对应列的信息。
列名描述INDEX_ID该列所属索引的 IDPOS该列在索引列中是第几列COL_NAME对应列的名称
以 INDEX_IDPOS列为主键的聚簇索引
5由页号为 7 的页面记录了 Data Dictionary Header。记录上述 4 个表的聚簇索引和二级索引对应的 B 树根页面的位置。 Max Row ID隐藏主键的 ID 号自增并且是全局共享的即拥有 row_id 列的不同表之间的这个值也都是不同的。 Max Table ID自增的表 ID 值。 之后记录了这些索引根页面的页号对应上述 4 个表中的索引。
把数据字典信息当成一个段来分配存储空间该段只有一个碎片页即页号为 7 的页。
6information_schema 系统数据表
在存储引擎启动时读取这些 SYS 开头的系统表然后填充到以 INNODB_SYS 开头的表中。
参考书籍
《MySQL 是怎样运行的》