InnoDB引擎
逻辑存储结构
-
-
表空间:xxx.ibd
-
段
- 数据段
- 索引段
- 回滚段
- InnoDB是索引组织表,数据段就是B+树的叶子节点, 索引段即为B+树的非叶子节点。段用来管理多个Extent(区)
-
区
- 表空间的单元结构,每个区的大小为1M
- 默认情况下, InnoDB存储引擎页大小为16K, 即一个区中一共有64个连续的页
-
页
- InnoDB 存储引擎磁盘管理的最小单元
- 每个页的大小默认为 16KB
- InnoDB 存储引擎每次从磁盘申请 4-5 个区
-
行
- InnoDB 存储引擎数据是按行进行存放的
- 默认有两个隐藏字段
- Trx_id:每次对某条记录进行改动时,都会把对应的事务id赋值给trx_id隐藏列
- Roll_pointer: 把旧的版本写入到undo日志中,然后这个隐藏列就相当于一个指针,可以通过它来找到该记录修改前的信息
架构
概述
- InnoDB架构图
-
- 内存结构
-
-
Buffer Pool
- 为了尽可能弥补这两者之间的I/O效率的差值,就需要把经常使用的数据加载缓冲池中,避免每次访问都进行磁盘I/O。
- InnoDB的缓冲池中不仅缓存了索引页和数据页,还包含了undo页、插入缓存、适应哈希索引以及InnoDB的锁信息等等
- 主内存中的一个区域
- 里面可以缓存磁盘上经常操作的真实数据
- 在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓存)
- 再以一定频率刷新到磁盘,从而减少磁盘IO,加快处理速度
- 缓冲池以Page页为单位,底层采用链表数据结构管理Page
- free page:空闲page,未被使用
- clean page:被使用page,数据没有被修改过
- dirty page:脏页,被使用page,数据被修改过,也中数据与磁盘的数据产生了不一致
- 专用服务器上,通常将多达80%的物理内存分配给缓冲池
show variables like 'innodb_buffer_pool_size';
-
Change Buffer
- 更改缓冲区(针对于非唯一二级索引页),在执行DML语句时
- 如果这些数据Page没有在Buffer Pool中,不会直接操作磁盘
- 会将数据变更存在更改缓冲区 Change Buffer中,
- 在未来数据被读取时,再将数据合并恢复到Buffer Pool中,再将合并后的数据刷新到磁盘中
- 原因:
- 二级索引通常是非唯一的,并且以相对随机的顺序插入二级索引
- 删除和更新可能会影响索引树中不相邻的二级索引页,如果每一次都操作磁盘,会造成大量的磁盘IO
- 有了ChangeBuffer之后,我们可以在缓冲池中进行合并处理,减少磁盘IO
-
Adaptive Hash Index
- 用于优化对Buffer Pool数据的查询
- 是hash索引又不适合做范围查询、模糊匹配
- InnoDB存储引擎会监控对表上各索引页的查询,如果观察到在特定的条件下hash索引可以提升速度,则建立hash索引,称之为自适应hash索引
- 自适应哈希索引,无需人工干预,是系统根据情况自动完成
-
Log Buffer
- 日志缓冲区,用来保存要写入到磁盘中的log日志数据(redo log,undo log)
- 默认大小为 16MB,日志缓冲区的日志会定期刷新到磁盘中
- 如果需要更新、插入或删除许多行的事务,增加日志缓冲区的大小可以节省磁盘 I/O
- innodb_log_buffer_size:缓冲区大小
- innodb_flush_log_at_trx_commit
- 1: 日志在每次事务提交时写入并刷新到磁盘,默认值
- 0: 每秒将日志写入并刷新到磁盘一次
- 2: 日志在每次事务提交后写入,并每秒刷新到磁盘一次
-
磁盘结构
-
图解
-
-
System Tablespace
- 系统表空间,默认的文件名叫 ibdata1
-
File-Per-Table Tablespaces
- 如果开启了innodb_file_per_table开关,则每个表的文件表空间包含单个InnoDB表的数据和索引 ,并存储在文件系统上的单个数据文件中。
- innodb_file_per_table ,该参数默认开启
-
General Tablespaces
- 通用表空间,需要通过 CREATE TABLESPACE语法创建通用表空间,在创建表时,可以指定该表空间
-
Undo Tablespaces
- 撤销表空间,MySQL实例在初始化时会自动创建两个默认的undo表空间(初始大小16M),用于存储undo log日志
-
Temporary Tablespaces
- InnoDB 使用会话临时表空间和全局临时表空间。存储用户创建的临时表等数据
-
Doublewrite Buffer Files
- 双写缓冲区,innoDB引擎将数据页从Buffer Pool刷新到磁盘前,先将数据页写入双写缓冲区文件
中,便于系统异常时恢复数据
- 双写缓冲区,innoDB引擎将数据页从Buffer Pool刷新到磁盘前,先将数据页写入双写缓冲区文件
-
Redo Log
- 重做日志,是用来实现事务的持久
- 该日志文件由两部分组成
- 重做日志缓冲
- 重做日志文件
- 前者是在内存中,后者在磁盘中
-
后台线程
-
- Master Thread
- 核心后台线程,负责调度其他线程
- 还负责将缓冲池中的数据异步刷新到磁盘中, 保持数据的一致性
- 还包括脏页的刷新、合并插入缓存、undo页的回收
- IO Thread
-
- 命令
show engine innodb status \G;
-
- Purge Thread
- 主要用于回收事务已经提交了的undo log,在事务提交之后,undo log可能不用了,就用它来回收
- Page Cleaner Thread
- 协助 Master Thread 刷新脏页到磁盘的线程,它可以减轻 Master Thread 的工作压力,减少阻塞
-