mysql总结(一)

1.Innodb将数据划 分为若⼲个⻚,以⻚作为磁盘和内存之间交互的基本单位,InnoDB 中⻚的⼤⼩⼀般为 16 KB

2.DB_ROW_ID是一个隐藏列,当表里没有主键,表会把Unique当做主键,如果连Unique都没有,就会把row_id作为主键

数据页的结构

名称  

FileHeader                                    文件头部                     38字节                        页的一些通用信息

PageHeader                                 页面头部                     56字节                      数据页专有的一些信息

Infimum supremum                      最小记录和最大记录   26字节                         两个虚拟的行记录

User Records                               用户记录                      不确定                        实际存储的行记录内容

Free Space                                  空闲空间                    不确定                        页中尚未使用的空间 

Page Directory                            页面目录                     不确定                        页中某些记录的相对位置

File Tailer                                    文件尾部                       不确定                         校验页是否完整

记录在页中的存储

一开始生成页的时候并没有User Records这个部分.每当我们插⼊⼀条记录,都会从 Free Space部分,也就是尚未使⽤的存储空间中申请⼀个记录⼤⼩ 的空间划分到User Records部分,当Free Space部分的空间全 部被User Records部分替代掉之后,也就意味着这个⻚使⽤完 了,如果还有新的记录插⼊的话,就需要去申请新的⻚了.

行记录结构

delete_mask :属性标记着当前记录是否被删除,占用1个2进制位值,为0的时候代表记录并没有被删除,为1的时候代表记录被删除 掉了。

当删除行记录时,其实被没有删除,只是在delete_mask上标记为了1,当有新的记录插入进来的时候,就会插入到这些被标记为1的位置

min_rec_mask:B+树的每层⾮叶⼦节点中的最⼩记录都会添加该标记

n_owned:表示此分组中拥有多少条记录

heap_no:这个属性表示当前记录本页中的位置mysql会给每个页自动加入两个记录,一个代表最小记录,一个代表最大记录,这两个记录也称为虚拟记录

record_type:这个属性表示当前记录的类型,⼀共有4种类型的记录,0表示 普通记录,1表示B+树⾮叶节点记录,2表示最⼩记录,3表示 最⼤记录。

next_record:它表示从当前记录的真实数据到下⼀条记 录的真实数据的地址偏移量

Page Directory(⻚⽬录)

1.将所有正常的记录(包括最⼤和最⼩记录,不包括标记为已删 除的记录)划分为⼏个组。

2.每个组的最后⼀条记录(也就是组内最⼤的那条记录)的头信 息中的n_owned属性表示该记录拥有多少条记录,也就是该组 内共有⼏条记录

3.将每个组的最后⼀条记录的地址偏移量单独提取出来按顺序存 储到靠近⻚的尾部的地⽅,这个地⽅就是所谓的Page Directory,也就是⻚⽬录(此时应该返回头看看⻚⾯各个部 分的图)。⻚⾯⽬录中的这些地址偏移量被称为槽(英⽂ 名:Slot),所以这个⻚⾯⽬录就是由槽组成的。

Page Header(⻚⾯头部)占用固定的56个字节

在页中的查找:在通过主键查找某条记录的时候可以在⻚⽬ 录中使⽤⼆分法快速定位到对应的槽,然后再遍历该槽对应分组中的 记录即可快速找到指定的记录

B+树索引

各个数 据⻚可以组成⼀个双向链表,⽽每个数据⻚中的记录会按照主键值从 ⼩到⼤的顺序组成⼀个单向链表

mysql会给数据页建立一个目录项:每个目录项代表一个数据页,每个目录项包含以下两个部分:

  ⻚的⽤户记录中最⼩的主键值,我们⽤key来表示

  ⻚号,我们⽤page_no表示

  

下⼀个数据⻚中⽤户记录的主键值必须⼤于上⼀个⻚中 ⽤户记录的主键值

假设查询主键为20的记录

先从⽬录项中根据⼆分法快速确定出主键值为20的记录 在⽬录项3中(因为 12 < 20 < 209),它对应的⻚是 ⻚9。

再根据前边说的在⻚中查找记录的⽅式去⻚9中定位具体 的记录。

这个目录项就叫做索引

Mysql的数据目录

查看数据目录的位置

每创建一个数据库时,mysql会在数据目录下创建一个与数据库同名的目录

在数据库文件下还会创建一个dp.obt文件.这个⽂件中包含了该数据库的各种属性,⽐⽅说该数据库 的字符集和⽐较规则是个啥。

表在文件系统中的展示

我们的数据其实都是以记录的形式插⼊到表中的,每个表的信息其实 可以分为两种:

1. 表结构的定义:表结构就是该表的名称是啥,表⾥边有多少列,每个列的数据类型是 啥,有啥约束条件和索引,⽤的是啥字符集和⽐较规则

mysql会在数据库目录下创建一个专门描述表结构的文件,文件名是表名.frm

2. 表中的数据:在MySQL5.6.6以及之后的版本中,InnoDB并不会默认的把各个表 的数据存储到系统表空间中,⽽是为每⼀个表建⽴⼀个独⽴表空间, 也就是说我们创建了多少个表,就有多少个独⽴表空间。使⽤独⽴表 空间来存储表数据的话,会在该表所属数据库对应的⼦⽬录下创建⼀ 个表示该独⽴表空间的⽂件,⽂件名和表名相同,只不过添加了⼀ 个.ibd的扩展名⽽已.

系统表空间:所谓的系统表空间可以对应⽂件系统上⼀个或多个实际的⽂件.InnoDB会在数据⽬录下创建⼀个名为ibdata1的文件

独立表空间:

MySQL系统数据库简介

mysql:这个数据库贼核⼼,它存储了MySQL的⽤户账户和权限信息, ⼀些存储过程、事件的定义信息,⼀些运⾏过程中产⽣的⽇志 信息,⼀些帮助信息以及时区信息等。

information_schema:这个数据库保存着MySQL服务器维护的所有其他数据库的信 息,⽐如有哪些表、哪些视图、哪些触发器、哪些列、哪些索 引吧啦吧啦。这些信息并不是真实的⽤户数据,⽽是⼀些描述 性信息,有时候也称之为元数据。

performance_schema:这个数据库⾥主要保存MySQL服务器运⾏过程中的⼀些状态信 息,算是对MySQL服务器的⼀个性能监控。包括统计最近执⾏ 了哪些语句,在执⾏过程的每个阶段都花费了多⻓时间,内存 的使⽤情况等等信息。

sys:这个数据库主要是通过视图的形式把information_schema 和performance_schema结合起来,让程序员可以更⽅便的 了解MySQL服务器的⼀些性能信息。

常用的页面类型

innodb提出区的概念,连续的64个区就是一个页,一个区默认占用1M空间.表空间可以看做是由若干个区组成的,每256个区划分为1组

段的概念:对B+树的叶⼦ 节点和⾮叶⼦节点进⾏了区别对待,也就是说叶⼦节点有⾃⼰独有的 区,⾮叶⼦节点也有⾃⼰独有的区。存放叶⼦节点的区的集合就算是 ⼀个段(segment),存放⾮叶⼦节点的区的集合也算是⼀个段。 也就是说⼀个索引会⽣成2个段,⼀个叶⼦节点段,⼀个⾮叶⼦节点 段

碎片区不属于任何段,他属于表空间.

区的分类

空闲的区:现在还没有⽤到这个区中的任何⻚⾯。

有剩余空间的碎⽚区:表示碎⽚区中还有可⽤的⻚⾯。

没有剩余空间的碎⽚区:表示碎⽚区中的所有⻚⾯都被使⽤, 没有空闲⻚⾯。

附属于某个段的区

状态名 含义

FREE                     空闲的区

FREE_FRAG        有剩余空间的碎⽚区

FULL_FRAG         没有剩余空间的碎⽚区

FSEG                    附属于某个段的区

为了⽅便管理这些区设计了⼀个称为XDES Entry的结构(全称就是Extent Descriptor Entry),每⼀个区都 对应着⼀个XDES Entry结构,这个结构记录了对应的区的⼀些属 性。我们先看图来对这个结构有个⼤致的了解:

innodb为每个段中的区对 应的XDES Entry结构建⽴了三个链表

FREE链表:同⼀个段中,所有⻚⾯都是空闲的区对应的 XDES Entry结构会被加⼊到这个链表。注意和直属于表 空间的FREE链表区别开了,此处的FREE链表是附属于某 个段的。

NOT_FULL链表:同⼀个段中,仍有空闲空间的区对应的 XDES Entry结构会被加⼊到这个链表。

FULL链表:同⼀个段中,已经没有空闲空间的区对应的 XDES Entry结构会被加⼊到这个链表。

原文地址:https://www.cnblogs.com/lzh66/p/13648760.html