前言:
本期内容会比较多,可能部分衔接不是非常的完整,如果有错误的地方,欢迎留言指出
1.行溢出是什么东西?存放磁盘的多行数据的数据页到底长什么样子?
2.表空间以及划分多个数据页的数据区的概念
3.MySQL数据库的日志顺序读写以及数据文件随机读写原理
4.Linux操作系统的存储系统软件层原理刨析以及IO调度优化原理
5.数据库服务器使用的RAID存储架构
6.MySQL数据库服务器上的RAID存储架构的电池充放电原理【以及使用了RAID的SDRAM缓存机制充放电的性能抖动问题】
7.回顾redo日志对于事务提交之后,数据绝对不会丢失的意义
8.写入redo log日志文件,不也是写入磁盘么,差距在哪里?
9.buffer pool执行完增删改之后,写入日志的redo log长什么样?
10.redo log改进版,MySQL内的另外一个数据结构《redo log block》
11.redo log buffer揭秘以及redo log buffer中的缓冲日志,到底什么时候可以写入磁盘?
12.undo log回滚日志底层原理
1.行溢出是什么东西?存放磁盘的多行数据的数据页到底是长啥样的?
首先存放磁盘多行数据的数据页之前在第二章的时候就已经上过图了,这里主要深入一下行溢出是怎么引出的,例如一个varchar(65535),或者是一个text字段,那么可能这个字段的数据可能不止16KB,此时可能会就发生行溢出,可能一个字段多个数据页存储,此时的这个数据页中存放部分字段的数据,还会存放一个大约20字节的指针,指向其他数据页,也就是相当于图中示例:【如图】
2.表空间以及划分多个数据页的数据区的概念【可能有点点绕】
2.1:首先回顾一下数据页在磁盘中长啥样子,便于更快速的理解表空间,数据页和数据区,包括数据组。
一个数据页拆分成了很多个部分:“文件头,数据页头,最小记录和最大记录,多个数据行,空闲空间,数据页目录,文件尾部”;【如图】
2.2:什么是表空间?
在MySQL创建的表,实际上都会有一个表空间的概念,在磁盘上都会对应"标明.ibd"这样一个磁盘数据文件,在物理层面将,表空间就是对应一些磁盘上的数据文件,系统表空间可能对应的是多个磁盘文件,自己创建的表空间可能对应了一个"表名.ibd"文件,如图:
在表空间的磁盘文件中【.ibd】,会有很多很多的数据页,一个数据页16kb,所以一个表空间的磁盘文件中其实有很多的数据页,而表空间的其他各组数据区,每一组数据区的第一个数据区的头两个数据页,都是存放特殊信息,例如XDES数据页就是用来存放这一组数据区的一些相关属性,其实大白话就是描述这组数据区的东西。
2.3:那么什么又是数据区呢?extent
一个表空间中包含的数据页很多,不便于管理,所以在表空间中引入了一个数据区的概念:extent,这里要解释一下,不然越来越晕,一个数据区管理了多个数据页。就这么理解。每个数据区的第一个数据区的前3个数据页存放是一些特殊的信息,然后表空间的第一组数据区和第一个数据区的头三个数据页,都是存放特殊信息的,表空间的其他组数据区的第一个数据区的头两个数据页,也是存放特殊信息的。【有点绕,读多几遍就理解了】
2.4:什么又是数据组呢?
一个数据区对应连续的64个数据页,每个数据页是16KB,所以一个数据区是1mb,256个数据区划分为一组,也就是说256mb就是一组,一个数据组 = 256个数据区。
在磁盘上的各个表空间的数据文件中是通过数据区的概念,划分了很多很多的数据页,所以,当需要执行CRUD操作的时候,就是从磁盘上的表空间的数据文件中去加载一些数据页到buffer pool