MySQL高级【InnoDB引擎】

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1InnoDB引擎

1.1逻辑存储引擎

InnoDB的逻辑存储结构如下图所示:

1). 表空间 表空间是InnoDB存储引擎逻辑结构的最高层 如果用户启用了参数 innodb_file_per_table(在 8.0版本中默认开启) 则每张表都会有一个表空间(xxx.ibd一个mysql实例可以对应多个表空 间用于存储记录、索引等数据2). 段 段分为数据段(Leaf node segment、索引段(Non-leaf node segment、回滚段 (Rollback segmentInnoDB是索引组织表数据段就是B+树的叶子节点 索引段即为B+树的 非叶子节点。段用来管理多个Extent(区。 3). 区 区表空间的单元结构每个区的大小为1M。 默认情况下 InnoDB存储引擎页大小为16K 即一 个区中一共有64个连续的页。 4). 页 页是InnoDB 存储引擎磁盘管理的最小单元每个页的大小默认为 16KB。为了保证页的连续性 InnoDB 存储引擎每次从磁盘申请 4-5 个区5). 行 行InnoDB 存储引擎数据是按行进行存放的。 在行中默认有两个隐藏字段 1Trx_id每次对某条记录进行改动时都会把对应的事务id赋值给trx_id隐藏列。 2Roll_pointer每次对某条引记录进行改动时都会把旧的版本写入到undo日志中然后这个 隐藏列就相当于一个指针可以通过它来找到该记录修改前的信息。

1.2架构

1.2.1概述

MySQL5.5 版本开始默认使用InnoDB存储引擎它擅长事务处理具有崩溃恢复特性在日常开发 中使用非常广泛。下面是InnoDB架构图左侧为内存结构右侧为磁盘结构。

1.2.2内存结构

在左侧的内存结构中主要分为这么四大块儿 Buffer Pool、Change Buffer、Adaptive Hash Index、Log Buffer。 接下来介绍一下这四个部分。 1). Buffer Pool InnoDB存储引擎基于磁盘文件存储访问物理硬盘和在内存中进行访问速度相差很大为了尽可能 弥补这两者之间的I/O效率的差值就需要把经常使用的数据加载到缓冲池中避免每次访问都进行磁 盘I/O。

在InnoDB的缓冲池中不仅缓存了索引页和数据页还包含了undo页、插入缓存、自适应哈希索引以及 InnoDB的锁信息等等。

缓冲池 Buffer Pool是主内存中的一个区域里面可以缓存磁盘上经常操作的真实数据在执行增 删改查操作时先操作缓冲池中的数据(若缓冲池没有数据则从磁盘加载并缓存然后再以一定频 率刷新到磁盘从而减少磁盘IO加快处理速度。

缓冲池以Page页为单位底层采用链表数据结构管理Page。根据状态将Page分为三种类型 • free page空闲page未被使用。 • clean page被使用page数据没有被修改过。 • dirty page脏页被使用page数据被修改过也中数据与磁盘的数据产生了不一致。 在专用服务器上通常将多达80%的物理内存分配给缓冲池 。参数设置 show variables like 'innodb_buffer_pool_size';

在专用服务器上通常将多达80%的物理内存分配给缓冲池 。参数设置 show variables like 'innodb_buffer_pool_size';

2). Change Buffer

Change Buffer更改缓冲区(针对于非唯一二级索引页在执行DML语句时如果这些数据Page 没有在Buffer Pool中不会直接操作磁盘而会将数据变更存在更改缓冲区 Change Buffer 中在未来数据被读取时再将数据合并恢复到Buffer Pool中再将合并后的数据刷新到磁盘中。 Change Buffer的意义是什么呢?

先来看一幅图这个是二级索引的结构图

与聚集索引不同二级索引通常是非唯一的并且以相对随机的顺序插入二级索引。同样删除和更新 可能会影响索引树中不相邻的二级索引页如果每一次都操作磁盘会造成大量的磁盘IO。有了 ChangeBuffer之后我们可以在缓冲池中进行合并处理减少磁盘IO。

3). Adaptive Hash Index

自适应hash索引用于优化对Buffer Pool数据的查询。MySQL的innoDB引擎中虽然没有直接支持 hash索引但是给我们提供了一个功能就是这个自适应hash索引。因为前面我们讲到过hash索引在 进行等值匹配时一般性能是要高于B+树的因为hash索引一般只需要一次IO即可而B+树可能需 要几次匹配所以hash索引的效率要高但是hash索引又不适合做范围查询、模糊匹配等。 InnoDB存储引擎会监控对表上各索引页的查询如果观察到在特定的条件下hash索引可以提升速度 则建立hash索引称之为自适应hash索引。 自适应哈希索引无需人工干预是系统根据情况自动完成。 参数 adaptive_hash_index

4). Log Buffer Log Buffer日志缓冲区用来保存要写入到磁盘中的log日志数据(redo log 、undo log 默认大小为 16MB日志缓冲区的日志会定期刷新到磁盘中。如果需要更新、插入或删除许多行的事 务增加日志缓冲区的大小可以节省磁盘 I/O。 参数: innodb_log_buffer_size缓冲区大小 innodb_flush_log_at_trx_commit日志刷新到磁盘时机取值主要包含以下三个 1: 日志在每次事务提交时写入并刷新到磁盘默认值。 0: 每秒将日志写入并刷新到磁盘一次。 2: 日志在每次事务提交后写入并每秒刷新到磁盘一次。

1.2.3磁盘结构

接下来再来看看InnoDB体系结构的右边部分也就是磁盘结构

1). System Tablespace 系统表空间是更改缓冲区的存储区域。如果表是在系统表空间而不是每个表文件或通用表空间中创建 的它也可能包含表和索引数据。(在MySQL5.x版本中还包含InnoDB数据字典、undolog等) 参数innodb_data_file_path

系统表空间默认的文件名叫 ibdata1。 2). File-Per-Table Tablespaces 如果开启了innodb_file_per_table开关 则每个表的文件表空间包含单个InnoDB表的数据和索 引 并存储在文件系统上的单个数据文件中。 开关参数innodb_file_per_table 该参数默认开启。

那也就是说我们没创建一个表都会产生一个表空间文件如图

3). General Tablespaces 通用表空间需要通过 CREATE TABLESPACE 语法创建通用表空间在创建表时可以指定该表空 间。 A. 创建表空间

CREATE TABLESPACE ts_name ADD DATAFILE 'file_name' ENGINE = engine_name;

B. 创建表时指定表空间

CREATE TABLE xxx ... TABLESPACE ts_name;

4). Undo Tablespaces 撤销表空间MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M用于存储 undo log日志。 5). Temporary Tablespaces InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据。 6). Doublewrite Buffer Files 1 CREATE TABLESPACE ts_name ADD DATAFILE 'file_name' ENGINE = engine_name; 1 CREATE TABLE xxx ... TABLESPACE ts_name; 双写缓冲区innoDB引擎将数据页从Buffer Pool刷新到磁盘前先将数据页写入双写缓冲区文件 中便于系统异常时恢复数据。

7). Redo Log 重做日志是用来实现事务的持久性。该日志文件由两部分组成重做日志缓冲(redo log buffer以及重做日志文件(redo log,前者是在内存中后者在磁盘中。当事务提交之后会把所 有修改信息都会存到该日志中, 用于在刷新脏页到磁盘时,发生错误时, 进行数据恢复使用。 以循环方式写入重做日志文件涉及两个文件

前面我们介绍了InnoDB的内存结构以及磁盘结构那么内存中我们所更新的数据又是如何到磁盘 中的呢? 此时就涉及到一组后台线程接下来就来介绍一些InnoDB中涉及到的后台线程。

1.2.4后台线程

在InnoDB的后台线程中分为4类分别是Master Thread 、IO Thread、Purge Thread、 Page Cleaner Thread。

1). Master Thread 核心后台线程负责调度其他线程还负责将缓冲池中的数据异步刷新到磁盘中, 保持数据的一致性 还包括脏页的刷新、合并插入缓存、undo页的回收 。

2). IO Thread 在InnoDB存储引擎中大量使用了AIO来处理IO请求, 这样可以极大地提高数据库的性能而IO Thread主要负责这些IO请求的回调。

我们可以通过以下的这条指令查看到InnoDB的状态信息其中就包含IO Thread信息。

show engine innodb status \G;

3). Purge Thread 主要用于回收事务已经提交了的undo log在事务提交之后undo log可能不用了就用它来回 收。 4). Page Cleaner Thread 协助 Master Thread 刷新脏页到磁盘的线程它可以减轻 Master Thread 的工作压力减少阻 塞。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysql