Mysql

1:mysql服务器处理client分三部分:链接管理 解析与优化 存储引擎(表处理器,Innodb)

2:字符集和比较规则 一个比较规则对应一个的字符集,而Mysql之所以能排序 就是把值根据字符集编码之后进行排序  查看默认的比较规则 show collation like 'utf8\_%' 具体区分大小写之类的看书39页 3-2

4.innoDB记录存储结构

什么是innoDB:将表中的数据存储到磁盘上的一个存储引擎 

1.真正处理数据是生在内存中的,所以需要把磁盘中的数据加载到内存中,如果是写入or修改,还需要内存中的内容刷新到磁盘中, 而直接读写磁盘的速度是非常非常慢的,与内存不能比

2.所以当我们从从表中获取某些记录的时候是怎么操作的呢, InnoDB 会将数据划分成好多个页, 以页作为磁盘和内存直接的交互的单位,一般大小为16kg  Mysql系统变量 innodb_page_size 会显示页大小 默认值为16384字节-基本不会更改

3.innoDB行格式,我们往磁盘插入数据都是以记录为单位的, 一个页一般是 16KB ,当记录中的数据太多,当前页放不下的时候,会把多余的数据存储到其他页中,这种 现象称为 行溢出 。

建表的时候可以

> CREATE TABLE record_format_demo ( -> c1 VARCHAR(10), -> c2 VARCHAR(10) NOT NULL, -> c3 CHAR(10), -> c4 VARCHAR(10) -> ) CHARSET=ascii ROW_FORMAT=COMPACT;

ascii 字符集只包括空格、标点符号、数字、大小写字母和一些不可见字符,所以我们的汉字是不能存到这 个表里的。

4.COMPACT行格式

 

变长字段列表:比如 VARCHAR(M) 、 VARBINARY(M) 、各种 TEXT 类型,各种 BLOB ,作用:因为存储字节不固定,所以存储真实数据的时候,把这个数据占用的字节也存起来 所以变长字段真正的占用空间:是真实数据+占用字节数

在 Compact 行格式中,把所有变长字段的真实数据占用的字节长度都存放在记录的开头部位,从而形成一个变长 字段长度列表,各变长字段数据占用的字节数按照列的顺序 逆序存放,

 如 一条 

列名 存储内容 

c1 'aaaa'  

转为上面的行格式图就是, 把值转为16进制(因为行格式设置的是ascii ) 逆序排放

 

如果值为Null呢

变长字段长度列表中 只存储值为 非NULL 的列内容占用的长度,值为 NULL 的列的长度 是不储存的 。

 真实的数据也存储NULL值吗? 不是的

 Compact 行格式把这些值为 NULL 的列统一管理起来,存储到 NULL 值列表中 首先统计表中允许存储 NULL 的列有哪些。排除掉主键 和Not null修饰的

记录头信息 固定5个字节 40个二进制位

 

5.innoDB(页处理器)

1. InnoDB为了不同的目的而设计了不同类型的页,我们把用于存放记录的页叫做 数据页 。

2. 一个数据页可以被大致划分为7个部分,

  File Header ,表示页的一些通用信息,占固定的38字节。

  Page Header ,表示数据页专有的一些信息,占固定的56个字节。

  Infimum + Supremum ,两个虚拟的伪记录,分别表示页中的最小和最大记录,占固定的 26 个字节。

  User Records :真实存储我们插入的记录的部分,大小不固定。 Free Space :页中尚未使用的部分,大小不确定。

  Page Directory :页中的某些记录相对位置,也就是各个槽在页面中的地址偏移量,大小不固定,插 入的记录越多,这个部分占用的空间越多。 File Trailer :用于检验页是否完整的部分,占用固定的8个字节。

3. 每个记录的头信息中都有一个 next_record 属性,从而使页中的所有记录串联成一个 单链表 。

4. InnoDB 会为把页中的记录划分为若干个组,每个组的最后一个记录的地址偏移量作为一个 槽 ,存放在 Page Directory 中,所以在一个页中根据主键查找记录是非常快的,

  分为两步: 通过二分法确定该记录所在的槽。

       通过记录的next_record属性遍历该槽所在的组中的各个记录。

5. 每个数据页的 File Header 部分都有上一个和下一个页的编号,所以所有的数据页会组成一个 双链表 。

6. 为保证从内存中同步到磁盘的页的完整性,在页的首部和尾部都会存储页中数据的校验和和页面最后修改时 对应的 LSN 值,如果首部和尾部的校验和和 LSN 值校验不成功的话,就说明同步过程出现了问题。

 

 

存储方式:将数据划分为若干个页,以页作为磁盘和内存直接交互的基本单位。每页大小16Kb 在一般情况下就是从磁盘读16kb到内存, 把内存16kb刷盘到磁盘中

问题:如果一次只更新1条记录的字段没达到16kb,那么是怎么刷盘的?

1.平常我们都是以记录为单位向表中插入数据,这些记录在磁盘的存放也成为行格式

COMPACT行格式由:(变长字段长度列表+NULL值列表+记录头信息 记录的额外信息)+列1的值+列2的值+.....列N的值

所以像 varchar等变长字段类型,=真正的数据内容+数据占用的字节数(存在变长字段的长度列表里面) 各个变长字段的真实数据占用的字节数按照列的逆序存放, 

为啥是逆序呢?

2.NULL值列表

一些记录中可能存储NULL值,NULL是怎么存储的

如果把NULL都放到记录的真实数据中存储会很占地方,所以COMPACT行格式会把一条记录的null的列统一管理 排除主键和不为NULL的列,按照二进制位,逆序排列  二进制位1时 标识该列的值为NULLmm    

3.记录头信息固定5个字节=40位每一位代表不同的意思

4.记录的真实数据

innoDB主键生成策略:优先以用户定义的主键为主,没有则以不为NULL的Unique,如果也没有,则添加一个名为row_id的隐藏主键列

 

posted @ 2022-11-15 20:18  12不懂3  阅读(28)  评论(0编辑  收藏  举报
创作不易,请勿抄袭,欢迎转载!