提示:文章内容来自《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服务器的性能。