mysql5.7——innodb存储引擎总结

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

一、innodb初探:

1、MySQL日志文件:

①:slow.log 文件会记录慢查询日志,当一条语句执行时间超过在配置参数long_query_time中指定的值时,这条语句就会被记录在这个文件中;

②:error.log 文件会记录一些系统启动或运行时的错误或警告信息,通过配置参数log_error来设置;

③:general.log 文件会记录所有在数据库上执行的语句,经常用来追踪问题,但会影响一点性能,所以一般不会打开,只有在调试的时候会偶尔开启。(如果在QPS很高的情况下,这个文件可能会非常大不太好处理一般不建议打开)


2、MySQL系统的datadir目录下,有一个目录叫MySQL:

 这个目录实际上是MySQL数据库的一些系统表,比如权限、用户等,但这些表都是MyISAM存储引擎的表;


3、默认的3个数据库实例:information_schema  performance_schema  sys

①:information_schema :

  information_schema数据库是MySQL自带的,它是一个信息数据库,其中保存着关于MySQL服务器维护的所有其他数据库的信息,如数据库名、数据库表、表列的数据类型及访问权限等;在该数据库中有数个只读表,它们实际上是视图,而不是基本表;


②:performance_schema:

  performance_schema数据库是在MySQL5.5新增的,命名为performance_schema,该数据库它是针对性能的,主要用于收集数据库服务器性能参数。该数据库有如下功能:

  提供进程等待的详细信息,包括锁、互斥变量、文件信息;

  保存历史事件汇总信息,为判断MySQL服务器性能做出详细的依据

  添加或删除监控事件点都非常不容易,并可以随意改变MySQL服务器的监控周期;


③:sys:

  sys数据库是MySQL5.7中首次加入的系统信息库,这个库类似Oracle中动态视图,通过这库可以快速的了解系统的元数据信息,并非常方便的让DBA发型数据库的很多信息,在解决性能瓶颈、自动化运维方面提供了巨大的帮助。该库在MySQL5.7中是默认的,在5.6可以手动导入;

注意:这个库是通过视图的形式把information_schema和performance_schema结合起来的,查询出让人更加容易理解的结果;但是前提是,sys库本身的信息来源要依赖information_schema;


4、innoDB存储引擎包括两个默认的日志文件,

   日志文件大小通过参数innodb_log_file_size来设置,个数通过参数innodb_log_files_in_group来设置。这几个日志文件的大小被设置后在运行过程中是不能被改变的,如果要修改需要关闭数据库然后修改;

--注意:innodb存储引擎还有一个小文件,db.opt 这个文件存储的是MySQL数据库的一些配置信息,例如编码,排序的信息,如果在创建数据库时指定一些非默认的参数的话就会在这个文件中存储这些信息;


二、innodb数据字典:

1、在MySQL中是看不到数据字典的,原因就是MySQL是一个插件式的数据库管理系统,它的结构分两层,分别是server层和存储引擎层,这两层需要相互配合才能一起友好的工作,但是作为一个插件式的数据库管理系统,存储引擎层可以有多个存储引擎的插件,但server层只有一个;最早的默认存储引擎为MyISAM,它是没有数据字典的,关于表结构,它所拥有的只有.frm文件,所以这导致了innodb也必须要有这个文件才能使得server层识别并管理它;


2、innodb有4个最基本的系统表,

 用来存储用户定义的表、列、索引及索引列等信息,这些表分别为:sys_tables  sys_columns  sys_indexes  sys_fields

①:sys_tables表:用来存储所有以innodb为存储引擎的表,每条记录对应已经定义的一个表;

  name:表示一个表名

  ID:表的ID号

  N_COLSL :表示这个表的列的个数,建表指定的列数(4个字节)

  type:表示这个表的存储类型,包括记录的格式、压缩等信息(4个字节)

  space:表示这个表所在的表空间ID号;

  (其中,mix_id  mix_len  cluster_name这三个位置暂时使用不到)


②:sys_columns:用来存储innodb中定义的所有表中所有列的信息,每一列对应这个表中的一条记录;

  table_id :表示这个列所属的表的ID号;

  pos :表示这个列在表中是第几列;

  name :表示这个列的列名

  mtype :表示这个列的主数据类型;

  prtype :表示这个列的一些精确数据类型,它是一个组合值,包括null标志,是否有符号数的标志,是否是二进制字符串的标志及表示这个列是真的varchar;

  len :表示这个列的数据长度,但不包括varchar类型,因为这个类型在记录里面存储了数据长度

  prec :表示这个列数据的精度,但目前好像没有使用;


③:sys_indexes:用来存储innodb中所有表的索引信息,每条记录对应一个索引;

  table_id :表示这个索引所属的表的ID号

  ID :表示这个索引的索引ID号

  name :表示这个索引的索引名;

  n_fields :表示这个索引包含的列个数;

  type :表示这个索引的类型,包括聚簇索引、唯一索引、等

  space :表示这个索引数据所在表空间ID号;

  page_no :表示这个索引对应的B+树的根页面;


④:sys_fields :用来存储所有索引中定义的索引列,每一条记录对应一个索引列 

  index_id :这个列所在的索引

  pos :这个列在某个索引中是第几个索引列;

  col_name :这个索引列的列名;

  

3、字典表加载:

  在innodb启动的时候,如果是新建数据库,则需要初始化库,所以首先需要做的就是创建字典管理的B+树等信息,在这些初始化操作之后,就通过函数dict_boot加载常驻内存的四个系统表并读取一些其他信息;


4、rowid管理:

  在innodb中,用户表中的记录不一定都会有一个rowid列,rowid只有在一个表没有定义主键时,也就是需要rowid作为聚簇索引列的时候才会被分配给这个表。而rowid的管理分配,并不是一个表独享一个ID空间,而是全局的,所有表都共享这个ID号;


三、innodb数据存储结构  

1、表空间文件组成结构

  innodb存储引擎在存储设计上模仿了Oracle的存储结构,其数据是按照表空间进行管理的。新建一个数据库时,innodb存储引擎会初始化一个名为ibdata1 的表空间文件,默认情况下,这个文件会存储所有表的数据,以及我们所熟知但看不到的系统表sys_tables、sys_columns、sys_indexes 、sys_fields等。此外,还会存储用来保证数据完整性的回滚段数据,当然这部分数据在新版本的MySQL中,已经可以通过参数来设置回滚段的存储位置了;

  innodb存储引擎的设计很灵活,可以通过参数innodb_file_per_table来设置,使得每一个表都对应一个自己的独立表空间文件,而不是存储到公共的ibdata1文件中。独立的表空间文件之存储对应表的B+树数据、索引和插入缓冲等信息,其余信息还是存储在默认表空间中。

  这个文件所存储的内容主要就是B+树(索引),一个表可以有多个索引,也就是在一个文件中,可以存储多个索引,而如果一个表没有索引的话,用来存储数据的被称为聚簇索引,也就是说这也是一个索引。最终的结论是,ibd文件存储的就是一个表的所有索引数据;

  

2、段:

  段是表空间文件中的主要组织结构,它是一个逻辑概念,用来管理物理文件,是构成索引、表、回滚段的基本元素。创建一个索引(B+树)时会同时创建两个段,分别是内节点段和叶子段,内节点段用来管理(存储)B+树非叶子(页面)的数据,叶子段用来管理(存储)B+树叶子节点的数据;也就是说,在索引数据量一直增长的过程中,所有新的存储空间的申请,都是从“段”这个概念中申请的。一个索引,包括两个段,那么一个表的段的数目就是索引的个数乘以2了。(更形象的解释:ibd文件,就是由多个段组成的,没有任何其他空间是脱离了段的管理。)


3、簇:

  innodb引入了簇的概念,在代码中被称为extent;

  簇是构成段的基本元素,一个段由若干个簇构成。一个簇是物理上连续分配的一个段空间,每一个段至少会有一个簇,在创建一个段时会创建一个默认的簇。如果存储数据时,一个簇已经不足以放下更多的数据,此时需要从这个段中分配一个新的簇来存放新的数据。一个段所管理的空间大小是无限的,可以一直扩展下去,但是扩展的最小单位就是簇。簇的空间大小是固定的,一般是64个页面;(簇是实际的物理存储空间)


4、页面:

  “页面”是簇细分之后的产物,它是簇的组成单位,也是段所管理的最小单位、数据文件管理的最小单位,当然也是文件中空间分配的最小单位。

  一个簇中可以包括多个页面(默认为64个页面,每个页面是16KB),这个页面数通常被叫做“簇的大小”。这些页面都归这个簇管理,在逻辑上(页面号都是从小到大连续的)及物理上都是连续的。在向表中插入数据时,如果一个页面已经被写完,系统会从当前簇中分配一个新的空闲页面处理使用,如果当前簇中的64个页面都被分配完,系统会从当前页面所在段中分配一个新的簇,然后再从这个簇中分配一个新的页面来使用;(更简单的说:表空间文件就是被划分成相等长度的块,每一个块就是一个页面,一个页面默认为16KB,一个文件中没有任何空间是脱离了段的管理而存在的)

---注意:没有任何空间不是一页面的形式而存在的。


5、段、簇、页面组织结构:

  一个表空间可以有多个文件,每个文件都有各自的编号,创建一个表空间时,至少有一个文件,这个文件被称为“0号文件”。一个文件是被切割为等长“默认16KB”的块,这个块通常被称为页面,那么在“0号文件”的第一个页面(page_no为0)中,存储了这个表空间中所有段簇也管理的入口,那么在这个页面存储的数据就是16KB,但通常会有页面头信息会占用一些空间,真正的管理信息数据是从页面偏移为fil_page_data(38)的位置开始的,这个位置存储了表空间的描述信息;


---注意:

①:表空间控制信息有:满簇链表、半满簇链表、空闲簇链表,而段的inode信息中也有这些信息;表空间中的链表管理的是整个表空间中所有的簇,包括满     簇、半满簇及空闲簇,而段的iNode信息中管理的是属于自己段中的满簇、半满簇及空闲簇。

②:在innodb中,一个簇描述页面要管理16384个页面,簇大小默认为(fsp_extent_size)64个,而簇描述符的大小为40B,所以一个簇描述页面中可以描述      的簇的个数为(univ_page_size-页面头长度)/40,其中univ_page_size=16384B表示页面大小;在一个表空间中,簇描述页面的存储是每隔16384个页      面就有一个簇描述页面,所以簇描述页面中只需要描述16384个页面即可;

③:所谓的btr,在innodb中,表示的就是B+树的处理,不管以它为开头的是函数,还是文件,都是相关的处理,是Btree的简称;













本文转自一个笨小孩51CTO博客,原文链接:http://blog.51cto.com/fengfeng688/1954429 ,如需转载请自行联系原作者






相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
MySQL底层概述—2.InnoDB磁盘结构
InnoDB磁盘结构主要包括表空间(Tablespaces)、数据字典(Data Dictionary)、双写缓冲区(Double Write Buffer)、重做日志(redo log)和撤销日志(undo log)。其中,表空间分为系统、独立、通用、Undo及临时表空间,分别用于存储不同类型的数据。数据字典从MySQL 8.0起不再依赖.frm文件,转而使用InnoDB引擎存储,支持事务原子性DDL操作。
229 100
MySQL底层概述—2.InnoDB磁盘结构
MySQL底层概述—10.InnoDB锁机制
本文介绍了:锁概述、锁分类、全局锁实战、表级锁(偏读)实战、行级锁升级表级锁实战、间隙锁实战、临键锁实战、幻读演示和解决、行级锁(偏写)优化建议、乐观锁实战、行锁原理分析、死锁与解决方案
104 24
MySQL底层概述—10.InnoDB锁机制
MySQL底层概述—5.InnoDB参数优化
本文介绍了MySQL数据库中与内存、日志和IO线程相关的参数优化,旨在提升数据库性能。主要内容包括: 1. 内存相关参数优化:缓冲池内存大小配置、配置多个Buffer Pool实例、Chunk大小配置、InnoDB缓存性能评估、Page管理相关参数、Change Buffer相关参数优化。 2. 日志相关参数优化:日志缓冲区配置、日志文件参数优化。 3. IO线程相关参数优化: 查询缓存参数、脏页刷盘参数、LRU链表参数、脏页刷盘相关参数。
MySQL底层概述—5.InnoDB参数优化
MySQL底层概述—4.InnoDB数据文件
本文介绍了InnoDB表空间文件结构及其组成部分,包括表空间、段、区、页和行。表空间是最高逻辑层,包含多个段;段由若干个区组成,每个区包含64个连续的页,页用于存储多条行记录。文章还详细解析了Page结构,分为通用部分(文件头与文件尾)、数据记录部分和页目录部分。此外,文中探讨了行记录格式,包括四种行格式(Redundant、Compact、Dynamic和Compressed),重点介绍了Compact行记录格式及其溢出机制。最后,文章解释了不同行格式的特点及应用场景,帮助理解InnoDB存储引擎的工作原理。
MySQL底层概述—4.InnoDB数据文件
MySQL底层概述—3.InnoDB线程模型
InnoDB存储引擎采用多线程模型,包含多个后台线程以处理不同任务。主要线程包括:IO Thread负责读写数据页和日志;Purge Thread回收已提交事务的undo日志;Page Cleaner Thread刷新脏页并清理redo日志;Master Thread调度其他线程,定时刷新脏页、回收undo日志、写入redo日志和合并写缓冲。各线程协同工作,确保数据一致性和高效性能。
MySQL底层概述—3.InnoDB线程模型
MySQL底层概述—1.InnoDB内存结构
本文介绍了InnoDB引擎的关键组件和机制,包括引擎架构、Buffer Pool、Page管理机制、Change Buffer、Log Buffer及Adaptive Hash Index。
238 97
MySQL底层概述—1.InnoDB内存结构
MySQL原理简介—2.InnoDB架构原理和执行流程
本文介绍了MySQL中更新语句的执行流程及其背后的机制,主要包括: 1. **更新语句的执行流程**:从SQL解析到执行器调用InnoDB存储引擎接口。 2. **Buffer Pool缓冲池**:缓存磁盘数据,减少磁盘I/O。 3. **Undo日志**:记录更新前的数据,支持事务回滚。 4. **Redo日志**:确保事务持久性,防止宕机导致的数据丢失。 5. **Binlog日志**:记录逻辑操作,用于数据恢复和主从复制。 6. **事务提交机制**:包括redo日志和binlog日志的刷盘策略,确保数据一致性。 7. **后台IO线程**:将内存中的脏数据异步刷入磁盘。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL存储引擎详述:InnoDB为何胜出?
MySQL 是最流行的开源关系型数据库之一,其存储引擎设计是其高效灵活的关键。InnoDB 作为默认存储引擎,支持事务、行级锁和外键约束,适用于高并发读写和数据完整性要求高的场景;而 MyISAM 不支持事务,适合读密集且对事务要求不高的应用。根据不同需求选择合适的存储引擎至关重要,官方推荐大多数场景使用 InnoDB。
100 7
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
235 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件