mysql源码分析——InnoDB的磁盘结构

一、磁盘结构的内容

InnoDB磁盘结构主要包含表空间,数据字典,双写缓冲区、日志(重做日志和撤销日志)。说起内存结构和磁盘结构,很多人可能有点晕,确实,刚刚接触的或者没有搞清楚是什么问题的,一定会有些晕。其实这个如果搞过内存数据写物理文件的,就容易理解了。在内存中,会有一套数据结构,然后会把这些数据最终整理成一套易于和硬盘交互的结构,这样,就更容易程序的编写和维护。
如果单纯是为了实现功能,写代码其实并不会有多么复杂。优秀的框架代码之所以为初学者感觉到复杂的原因,正是因为弹性扩展和高度的抽象,主要的目的就是为了适应性尽可能大一些,维护更方便一些。
在这里插入图片描述

二、表空间

说起表空间,其实很多人,包括许多用了数据库多年的人,也说不出这玩意儿到底是个啥。什么是表空间呢?如果用过Oracle,就会知道Oracle搞的表空间。表空间是一个逻辑概念,什么是逻辑概念呢,其实就是前面提到的这是一个抽象的数据管理概念。之所以很多人对表空间觉得似是而非,主要原因也在于这个空间的抽象。一个表空间只能归属于一个数据库,但是数据库对象都要存放在指定的表空间中。之所以叫表空间,是因为在数据库中,最常见,最多,最为人熟知的就是表,而这个空间中存放的主要也是表,所以叫做表空间。
在MySql中主要分为以下几类:
1、系统表空间
Change Buffer相关数据就是存储在系统表空间。包括一些辅助索引的变化,当数据库Crash时,这些变更会Flush磁盘的相关Change Buffer中。除此之外,它还可以存储某些表和索引的数据;不同的版本中系统 表空间对存放的数据字典也有不同,老版本中直接包含InnoDB的数据字典;系统表空间在MySql8之后开始使用SDI(Serialized Dictionary Information)来存储相关元数据信息。

2、独立表空间
独立表空间是一个单 表表空间,其创建于本身的数据文件,而不是上面提到的系统表空间。其支持动态和压缩行格式。此表空间默认是开启的。

3、通用表空间
CREATE TABLESPACE创建的表空间为通用表空间,是一个共享的表空间,一个文件可以存储多个表。

4、Undo表空间
这个就好理解了,用来回滚表的空间,即存储回滚日志。

5、临时表空间
这个不用多说吧,就是一个暂时使用的表空间。会话临时表空间和全局临时表空间是比较常见的两种。

三、数据字典

数据字典是描述数据的信息集合是对数据库中所有数据元素定义的集合。在MySql的InnoDB中,数据字典由内部的系统表组成。这些系统表的主要作用就是对表和索引等的元数据的描述。换句话说,元数据在位于InnoDB的系统表空间中(由于版本延革的不同,导致元数据文件与其信息出现重合)。

四、双写缓冲区

Doublewrite Buffer,双写缓冲区,想想也知道,就是写两次。为什么要写两次呢,这不是更浪费空间和时间么?在数据库中,反复提到,数据的安全性和速度是一个要平衡的条件。而双写主要是为了实现安全性。在数据库实际使用的过程中,有可能遇到意外断电、数据库意外崩溃或系统宕机等风险。这时,有可能出现数据写了部分的情况,这样,数据库在重启后如何处理是个很重要的问题。其实双写缓冲区就是解决了数据原子性问题。要么全写到硬盘,要么全写不到。在全写不到的情况下可以去DB缓冲区查找是否有,如果没有,则可以通过Redo Log搞定。
一定要明白,在MySql中,Redo Log可以解决整页数据的找回,但无法解决页内数据不完整的情况,即保持页内数据的原子性或者说完整性。(数据库刷新数据是按照页大小来刷新的,一个页默认大小 是16K,所以刷新的过程无法保证原子性,即可能刷新了一半,掉电,也即无法保证页内数据的完整性)当然,为了提高效率可以通过innodb_doublewrite=0或者1来关闭或者打开此选项。
在MySql8之间其在系统表空间中,但之后,则写入了DobuleWrite的文件中。

五、日志

1、重做日志
此日志是InnoDB自己的日志,就是对数据库表数据的请求进行编码记录,它会随着事务操作进行产生,然后等待脏数据Flush到磁盘后,Redo Log的空间就可以重复使用。其主要的作用就是用于修复不完整事务引起的数据的不完整。Redo Log的持久化特事特办可以通过Innodb_flush_log_at_trx_commit来设置。其有三个值:
0:最佳性能,每隔一秒刷入FSP,MySql主动Fsync,有可能丢失1秒的数据。
1:强一致性,默认,即来即刷。MySql主动Fsync性能较差
2:中间,即来即刷,但MySql隔一秒主动刷盘。但它最多也会丢失一秒的数据。

2、Binlog日志
MySql Server的二进制日志,主要是记录数据库表结构变更及数据修改的二进制日志。它不会会记录查找和显示这类操作,它以事件方式记录,主要应用于主从复制和数据恢复。

3、回滚日志
回滚日志就是为了保持事务性。它是在事务之间保存的的修改数据的备份,当出现意外时,可以将数据安全恢复到原样。它在事务开始时前生产,在事务提交后将其扔到删除列表中,由后强线程进行回收。其采用段的方式来管理记录数据。其重要作用有两点,一是实现事务的原子性,另外可以实现MVCC,即多版本并发控制。

六、总结

做为一个软件开发人员,提升自己的能力要从一开始的学会某种技能,技巧上升到学会抽象设计。毕竟,会再多的技巧和技能只是代表了时间的长短和经验的多寡,后来的人会轻松的达到这个水平。也就是说,可替代性非常高,而且,计算机的开发技术不断迭代,一些新的语言和技巧不断出现。这也导致很多人喊出跟不上的原因。其实,只要融会贯通了编程思想,抽象设计编程,就会发现,计算机整体的思想至少到现在仍然没有出现革命性的变化。而这种不断向上的抽象能力,恰恰是编程开发人员的竞争力的所在。不过,抽象能力对人的思考和总结复盘能力是一个极大的考验,是对开发人员长期的一种不断思考进取的考验。百尺之城,起于垒土;为山九仞,功亏一篑。这些都是非常不容易逾越的高山。
努力吧,迎难直上,百尺标头,再创新高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 确实,MySQL的varchar类型在InnoDB存储引擎中的存储结构比较复杂。在InnoDB中,每个记录都被存储为一个B+树节点,每个节点都有一个固定大小的页,通常为16KB。 当一个varchar类型的列被插入到InnoDB表中时,它会被拆分成两个部分:一个是实际的数据,另一个是长度信息。长度信息会被存储在记录头中,而实际的数据会被存储在记录的数据页中。 在InnoDB中,如果一个varchar类型的列的长度小于等于768个字节,那么它会被存储在记录的数据页中。如果一个varchar类型的列的长度超过了768个字节,那么它会被存储在单独的页中,并且在记录中只存储一个指向这个页的指针。 此外,由于InnoDB使用了行级锁定,每个记录都需要存储一个事务ID,用于实现MVCC(多版本并发控制)。因此,在InnoDB中,每个记录头还需要存储一个6字节的事务ID和一个2字节的回滚指针。 综上所述,当使用varchar类型时,需要注意其实际数据的长度和存储引擎的存储结构,以便更好地设计表结构和查询语句。 ### 回答2: MySQL的varchar存储结构确实是相当深奥的。在InnoDB存储引擎中,varchar类型的数据存储在表的记录中,其存储结构会影响数据写入、存储空间占用和查询性能。 首先,varchar类型的数据在记录中是以变长字符串的形式进行存储的。这意味着,varchar字段占用的存储空间与其实际存储的数据长度相关,而不是固定的。相比之下,固定长度的数据类型(如char)在存储时会占用固定的存储空间,无论实际数据的长度是多少。 其次,varchar类型的数据在记录中的存储格式是由一个表示长度的字节和真实字符串数据构成的。这个长度字段用于指示存储的实际数据的长度,使得数据库可以根据需要动态地分配存储空间,从而节省了存储空间。 此外,在InnoDB存储引擎中,varchar字段的数据存储在页内部的某个位置,而不是直接存储在页上。这是由于InnoDB采用了B+树的数据结构来组织数据,为了节省存储空间和提高数据访问效率,varchar字段的数据会被存储在叶子节点中。这样一来,在查询时可以更快地遍历和定位数据,提高查询性能。 综上所述,MySQL的varchar存储结构的深度体现在其变长存储方式、长度字段和数据存储位置等方面。了解和理解这些存储结构对于正确使用varchar类型的字段、优化存储空间和提高查询性能都是非常重要的。 ### 回答3: MySQL的varchar存储结构InnoDB引擎中确实是一个很深入的话题。InnoDB引擎是MySQL的默认引擎,它采用了B+树索引来存储数据。在InnoDB的记录存储结构中,varchar类型字段经过了一系列处理。 首先,InnoDB将每个记录分为固定长度部分和变长长度部分。varchar字段属于变长长度部分。对于varchar字段,MySQL会额外存储一个指针,指向数据存储区域。 其次,在实际存储varchar字段值时,InnoDB会使用两种方式。对于较短的varchar字段值,会直接将其存储在记录的数据域中。这样做的好处是可以减少额外的存储开销。 而对于较长的varchar字段值,InnoDB会将其存储在一个称为“Overflow Page”的额外存储空间中。Overflow Page的指针存储在记录的数据域中。Overflow Page与主记录有一个单独的物理连接。 另外,需要注意的是,在InnoDB中,varchar字段的长度是可变的,存储的最大长度由定义时的最大长度决定。这与char字段是不同的,char字段的长度是固定的。 总之,MySQL的varchar存储结构InnoDB引擎中是相对复杂的。它采用了不同的存储方式来处理不同长度的字段值,既保证了数据的存储效率,又满足了灵活性的要求。对于开发人员来说,了解varchar存储结构对于正确使用和优化数据库非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值