三、mysql——InnoDB和MySIAM是如何存储数据的

提示:文章内容来自《mysql是怎样运行的》以及部分B站宋红康老师的视频,这里仅仅是我的笔记,对重点内容的记录。强烈推荐购买这本书《mysql是怎样运行的》。


前言

这一章主要讲一下InnoDB、MySIAM类型的表的数据是如何在文件系统中存储数据的,MEMOERY我们就不多说了,它把数据缓存在内存中,服务器挂了数据也就没了,使用场景也比较少,如果做个缓存的话,我更倾向于使用一些专门做缓存的中间件,比如大家熟悉的redis。


提示:以下是本篇文章正文内容,下面案例可供参考

一、InnoDB是如何存储表数据的

在前面对行格式和页的讲述中,我们知道页是磁盘和内存交互的基本单位。
1、InnoDB其实是以页为基本单位来管理存储空间的,默认的页大小是16KB
2、对于InnoDB的存储引擎来说,每个索引都对应着一个B+树,该B+树的每个节点都对应着一个数据页。数据页之间通过双向链表连接(按照索引列升序)
3、InnoDB的聚簇索引的叶子节点存储了完整的用户记录,也就是说“索引即数据,数据即索引”

为了更好的管理这些页,InnoDB引入了表空间或文件空间的概念。表空间是一个抽象概念,它可以是文件系统上一个或多个真实的文件(不同表空间对应的文件数量可能不同)。每个表空间被划分为很多个页,表数据就存放在某个表空间的某些页中。

1.1 系统表空间

这个系统表空间可以对应文件系统上一个或多个实际的文件。在默认情况下,InnoDB会在目录下创建一个名为ibdata1、大小12mb的文件,这个文件就是对应的系统表空间在文件系统上的表示。另外这个系统表空间是自扩展的,所以不要觉得12mb很小,比较咱一个生产上的表上G都是小意思,5.5.7到5.6.5之间的版本,数据是默认存储在系统表空间中的。
总之表空间结构给我的感觉就在管理数据上,是粒度比较大的,不同的表放在一个逻辑结构里,总感觉不妥,因此下面提出了一个更好的逻辑结构存储数据。

1.2 独立表空间

独立表空间不同于系统表空间的是,InnoDB会为把每个表的数据放在不同的逻辑结构里。也就是说,有多少个表,就划分出多少个独立表空间,我觉得这样更方便管理数据。完整的数据保存在“表名.ibd”,一个表对应一个(这里面索引和数据是在一块的)

1.3 其他类型的表空间

通用表空间、undo表空间、临时表空间。。。。

二、MySIAM是如何存储数据的

这里MySIAM不做太多的说明(主要是我也没仔细研究过,比较InnoDB用的多)
1、MySIAM不存在“数据即索引,索引即数据”一说,为什么呢?以为它把数据和索引是分别存储的,数据存储在 【.MYD】文件中,索引存储在【.MYI文件】。
2、MySIAM没有表空间一说,数据和索引都存放到数据库子目录下
3、MySIAM没有可以没有主键,数据和索引不放一块,聚簇索引的优点也就没了,也就是MySIAM的索引都可以理解为二级索引,每次查了数据都是要“回表”的,不过这个“回表”比InnoDB快,因为它二级索引虽然不存储数据,但是它保存了真实数据的地址,直接拿地址找数据自然就快了。

三 Mysql系统数据库

1、mysql:这个数据库相当重要,它存储了Mysql的用户账户和权限信息、一些存储过程和事件的定义信息、一些运行过程中产生的日志信息、一些帮助信息以及一些区信息。
2、information_schema:这个数据库保存了一些MySQL服务器维护的所有其他数据库信息,比如有哪些表、哪些视图、哪些触发器、哪些列、哪些索引等。这些信息并不是真实的用户数据,而是一些描述性信息,有时候也称为元数据。
3、performance_schema:这个数据库主要是保存mysql服务器运行过程中的一些状态信息,算是对mysql的一个性能监控。它包含的信息有统计最近执行了哪些语句,在执行过程中每个阶段都花费了多长时间,内存的使用情况等。(这个表对于sql优化很重要,后面会详细说明)
4、sys:这个数据库主要是通过视图的形式把information_schema和performance_shema结合起来,让开发人员更方便的了解mysql服务器的性能。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值