MySql系列之Innodb存储引擎

Posted by Tango on October 16, 2018

插件化存储引擎是MySQL特点,用户可以根据自己的需求使用不同的存储引擎,甚至通过抽象的API接口实现自己的存储引擎。innodb存储引擎支持行级锁以及事务特性,也是多种场合使用较多的存储引擎,本文将介绍innodb存储引擎。

存储引擎简介

mysql系统来说,存储引擎是真正实现数据的存储与读取操作的对象,数据库实例通过抽象API接口与存储引擎交互,存储引擎自定义实现数据的物理、逻辑组织形式以及索引、事务等特性。 抽象存储引擎API接口是通过抽象类handler来实现,handler类提供诸如打开/关闭table、扫表、查询Key数据、写记录、删除记录等基础操作方法。每一个存储引擎通过继承handler类,实现以上提到的方法,在方法里面实现对底层存储引擎的读写接口的转调。从5.0版本开始,为了避免在初始化、事务提交、保存事务点、回滚操作时需要操作one-table实例,引入了handlerton结构让存储引擎提供了发生上面提到操作时的钩子操作。

存储引擎架构

物理组织结构

innodb存储引擎物理组织形式可以理解为其在磁盘的存储形式,表现为各种文件,其分类大概为

文件 功能 描述
ibdatat1 共享表空间文件 共享表空间,存储各种缓冲数据
.frm 表定义文件 记录表的定义,列名以及列的数据类型
.ibd 表数据存储文件 存储数据表的数据,按行存储
ib_logfile0/1 redo日志文件 重做日志文件,一共两个循环使用,一个写完即写另一个

逻辑组织结构

innodb数据逻辑存储形式为表空间,表空间→由段、区、页组成,页是innodb存储引擎磁盘管理的最小单位,即每次数据的读取与写入都是以页为单位。 其结构如下

表空间是innodb存储引擎逻辑结构的最高层,所有的数据都存储在表空间中,默认innodb有一个共享表空间,所有的数据都存储在共享表空间中,用户可以通参数innodb_per_table设置每张表单独存放在一个表空间中。 每张表的表空间内存储的只是数据、索引、插入缓冲页,其他数据,如回滚日志、插入缓冲索引页、事务信息,二次写缓冲等还是存放在共享表空间。

表空间由段组成,常见的段有数据段、索引段、回滚段组成,innodb存储引擎索引与数据共同存储,数据段即是B+树叶节点,索引段则存储非叶节点。

区则是由连续页组成,每个区的大小为1M,页的大小为16KB,即一个区中一共有64个连续的页。

语句的执行流程