文章目录
- InnoDB 主要特点
- InnoDB 架构
- In-Memory Structures
- Buffer Pool
- Change Buffer
- Adaptive Hash Index
- Log Buffer
- On-Disk Structures
- System Tablespace
- File-Per-Table Tablespaces
- General Tablespaces
- Undo Tablespaces
- Temporary Tablespaces
- Doublewrite Buffer
- Redo Log
- Undo Log
InnoDB是一款兼顾高可靠性和高性能的通用存储引擎。也是默认的MySQL存储引擎。
InnoDB 主要特点
- 它的DML操作遵循ACID模型,事务具有提交、回滚和崩溃恢复功能,以保护用户数据。
- 行级锁定和oracle风格的一致性读取提高了多用户并发性和性能。
- InnoDB表在磁盘上排列数据,以优化基于主键的查询。每个InnoDB表都有一个主键索引,称为集群索引,它组织数据以最小化主键查找的I/O。
- 为了维护数据的完整性,InnoDB支持FOREIGN KEY约束。对于外键,将检查插入、更新和删除,以确保它们不会导致相关表之间的不一致。
InnoDB特性:
InnoDB 架构
In-Memory Structures
Buffer Pool
Buffer Pool 是InnoDB在访问表和索引数据时缓存的主内存区域。缓冲池允许直接从内存访问频繁使用的数据,这加快了处理速度。在专用服务器上,通常会将多达80%的物理内存分配给缓冲池。
为了提高大容量读操作的效率,缓冲池被划分为可能包含多行的页面。为了提高缓存管理的效率,Buffer Pool 被实现为页面链表; 很少使用的数据使用LRU算法的变体从缓存中老化。
Change Buffer
Change Buffer 是一种特殊的数据结构,当二级索引页不在缓冲池中时,它将更改缓存到二级索引页。缓冲的更改可能来自INSERT、UPDATE或DELETE操作(DML),之后当其他读操作将页面加载到缓冲池中时,这些更改将被合并。
Adaptive Hash Index
自适应哈希索引使InnoDB在不牺牲事务特性或可靠性,且工作负载和缓冲池足够的情况下,在系统上更像一个内存数据库。自适应哈希索引由innodb_adaptive_hash_index变量启用,或者在服务器启动时通过——skip-innodb-adaptive-hash-index关闭。
Log Buffer
日志缓冲区是存储要写入磁盘上的日志文件的数据的内存区域。日志缓冲区大小由innodb_log_buffer_size变量定义。默认大小为16MB。日志缓冲区的内容定期刷新到磁盘。大的日志缓冲区允许运行大型事务,而不需要在事务提交之前将重做日志数据写入磁盘。因此,如果您有更新、插入或删除许多行的事务,那么增加日志缓冲区的大小可以节省磁盘I/O。
On-Disk Structures
System Tablespace
系统表空间是变更缓冲区的存储区域。如果表是在系统表空间中创建的,而不是在每个表文件或一般表空间中创建,则它还可能包含表和索引数据。
系统表空间可以包含一个或多个数据文件。默认情况下,在data目录中创建一个系统表空间数据文件ibdata1。系统表空间数据文件的大小和数量由innodb_data_file_path启动选项定义。
File-Per-Table Tablespaces
每个表文件的表空间包含单个InnoDB表的数据和索引,并存储在文件系统中的单个数据文件中。
General Tablespaces
通用表空间是使用CREATE tablespace
语法创建的共享InnoDB表空间。
Undo Tablespaces
Undo表空间包含Undo日志,这些日志是记录的集合,其中包含有关如何撤消事务对聚集索引记录的最新更改的信息。
Temporary Tablespaces
包含 session Temporary Tablespaces 和 global temporary tablespace:
-
session Temporary Tablespaces
当InnoDB被配置为磁盘上的内部临时表的存储引擎时,会话临时表空间存储由用户创建的临时表和优化器创建的内部临时表。磁盘上的内部临时表使用InnoDB存储引擎。
-
global temporary tablespace
全局临时表空间(ibtmp1)存储对用户创建的临时表所做更改的回滚段。
Doublewrite Buffer
Doublewrite Buffer是一个存储区域,InnoDB在将页面写入到InnoDB数据文件中的适当位置之前,会将从缓冲池中刷新的页面写入该存储区域。如果操作系统、存储子系统或mysqld进程在写页面的过程中意外退出,InnoDB可以在崩溃恢复期间从doublewrite缓冲区中找到一个好的页面副本。
虽然数据写入两次,但doublewrite缓冲区并不需要两倍的I/O开销或两倍的I/O操作。数据在一个大的顺序块中写入到doublewrite缓冲区,只需对操作系统调用一次fsync()
,除非innodb_flush_method被设置为O_DIRECT_NO_FSYNC。
Redo Log
redo log是一种基于磁盘的数据结构,用于在崩溃恢复期间纠正由不完整事务写入的数据。在正常的操作过程中,redo log对由SQL语句或低级API调用引起的更改表数据的请求进行编码。在意外关机之前未完成更新数据文件的修改将在初始化期间和接受连接之前自动执行。
Undo Log
undo logs 是与单个读写事务相关联的撤消日志记录的集合。undo log 记录包含有关如何撤销事务对聚集索引记录的最新更改的信息。如果另一个事务需要将原始数据作为一致读操作的一部分查看,则从撤销日志记录中检索未修改的数据。撤销日志存在于撤销日志段中,撤销日志段包含在回滚段中。回滚段位于undo表空间和全局临时表空间中。
位于全局临时表空间中的撤销日志用于修改用户定义临时表中的数据的事务。这些撤销日志不会重新记录,因为崩溃恢复不需要它们。它们仅用于服务器运行时的回滚。这种类型的撤销日志通过避免重做日志I/O来提高性能。