存储引擎:对数据库进行写入和读取,不同存储引擎使用不同的格式存放数据
Mysql服务器支持多种存储引擎,默认是InnoDB
对数据进行操作需要在内存上进行,而数据是存储在磁盘上的,磁盘读写比内存读写慢很多,从磁盘上一条一条地读数据很慢,所以InnoDB将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16 KB
记录在磁盘上的存放方式也被称为行格式或者记录格式 (ROW_FORMAT: Compact, Redundant, Dynamic, Compressed)
InnoDB 优先使用用户自定义主键作为主键,如果用户没有定义主键,则选取一个 Unique 键作为主键,如果表中连 Unique 键都没有定义的话,则 InnoDB 会为表默认添加一个名为 row_id 的隐藏列作为主键。
InnoDB存储引擎会为每条记录都添加 transaction_id 和 roll_pointer 这两个列,但是 row_id 是可选的(在没有自定义主键以及Unique键的情况下才会添加该列)。
在 Compact 行格式下只会把变长类型的列的长度逆序存到 变长字段长度列表 中。![dataPage]](/images/InnoDB/compact.png)
数据页代表的这块 16KB 大小的存储空间可以被划分为多个部分,不同部分有不同的功能。
在一开始生成页的时候,其实并没有 User Records 这个部分,每当我们插入一条记录,都会从 Free Space 部分,也就是尚未使用的存储空间中申请一个记录大小的空间划分到 User Records 部分,当 Free Space 部分的空间全部被 User Records 部分替代掉之后,也就意味着这个页使用完了,如果还有新的记录插入的话,就需要去申请新的页了,![dataPage]](/images/InnoDB/数据页.png)
记录的头信息中的 next_record 指得并不是按照我们插入顺序的下一条记录,而是按照主键值由小到大的顺序的下一条记录。而且规定 Infimum记录(也就是最小记录) 的下一条记录就是本页中主键值最小的用户记录,而本页中主键值最大的用户记录的下一条记录就是 Supremum记录(也就是最大记录)![dataPage]](/images/InnoDB/MinMax.png)
被删除的记录之所以不立即从磁盘上移除,是因为移除它们之后把其他的记录在磁盘上重新排列需要性能消耗,所以只是打一个删除标记而已,所有被删除掉的记录都会组成一个所谓的 垃圾链表 ,在这个链表中的记录占用的空间称之为所谓的 可重用空间 ,之后如果有新记录插入到表中的话,可能把这些被删除的记录占用的存储空间覆盖掉。![dataPage]](/images/InnoDB/delete.png)