首页 > 代码库 > InnoDB引擎架构的主要组件构成

InnoDB引擎架构的主要组件构成

1.Buffer pool
主缓冲区中的一块区域,缓存table 和 index data。允许直接从内存中频繁的使用数据,以加速数据的处理速度。在专用服务器上,80%以上的物理内存都分配给buffer pool。
为了高效的查询操作,buffer pool被分割为 pages (可以包含一条或多条记录,这取决于记录的数据量)。
为了高效的缓存管理,buffer pool 被实现为pages 的链表,使用LRU算法把访问量小的数据移出buffer pool。


2.change buffer
当受影响的pages不在buffer pool里的时候,Change buffer 存储对二级索引 pages 的改变。由insert,update,或delete操作产生的缓存的数据更改会在read 操作执行的时候,将被修改的pages载入、合并到buffer pool。
在内存上,change buffer 是buffer pool的一部分。在硬盘上,change buffer 是system tablespace的一部分。
Change buffer缓存的数据类型由 innodb_change_buffering 配置项管理。
SHOW ENGINE INNODB STATUS 命令可以查看 change buffer 、buffer pool等相关信息
INFORMATION_SCHEMA.INNODB_BUFFER_PAGE 表提供了buffer pool中所有page 的元数据。


3.Adaptive hash index
如果查询可以从hash index中获益,Innodb自动的在内存中创建 hash index ,以加速 = 和 in 操作符的查询操作。
innodb_adaptive_hash_index 选项用于配置hash index的开关。Hash index 也保存在buffer pool中,因此是否开启,需要做一些相关测试查,确保其他性能不会受到影响。


4.redo log buffer
是把数据写入redo log的内存区域。Innobd_log_buffer_size 用于配置redo log缓冲区的大小。较大的缓冲区支持较大的运行事务,而不用在事务提交之前将redo log 写入磁盘。
相关配置项:innodb_flush_log_at_trx_commit 和 innodb_flush_log_at_timeout


5.System tablespace

一个或多个数据文件(ibdata files),包含了 innodb相关对象(data dictionary),是undo logs change buffer doublewrite buffer 的存储区域。也可以包含表和索引数据。


6.Data dictionary

用于追踪 表、索引、列等innodb对象的元数据。元数据信息保存在system tablespace中。由于历史原因,在 .frm文件中和一些其他信息部分重叠。


7.doublewrite buffer
位于system tablespace的一块存储区域。在pages 写入到合适的数据文件之前,InnoDB将数据从buffer pool写入此doublewrite buffer。只有在数据写入到doublewrite buffer之后,engine 才把pages 写入的最终的数据文件中。如果发生server故障,那么在故障恢复期间,innodb可以从d-buffer中获取到一份好的page副本。
Double buffer是默认开启的。 innodb_doublewrite=0 可以进行关闭。


8.undo logs
一个undo log 是与单一事务相关的undo log records集合。一个undo log record包含了如何撤销事务导致的一个最新的数据更改的信息。如果另外一个事务需要查看原始数据,那么innodb会从undo log records 中获取修改之前的数据。


9.File-per-table tablespaces
数据表使用独立的数据文件,而不是存储在system tablespace。每个单独的表空间默认对应一个数据目录下的 .ibd 文件


10.redo log
文件组:ib_logfile0 和 ib_logfile1,其构成了redo log。用于故障恢复,保障非完整事务处理数据的正确性。


11.group commit for redo log flushing
Innodb和其他支持acid的数据库引擎一样,在事务提交之前,来刷新redo log。Innodb将这些类型刷新请求进行分组,以避免每次刷新请求都进行一次提交。使用分组提交的方案,innodb 会对多个用户事务进行一次提交来一次性的写入redo log file,最终提高吞吐量。


涉及主要的概念解释:
Cluster index:又称为primary key index,主键列的值决定了表数据的存储顺序,通过主键列来加速查询和排序。因为主键列决定了存储顺序,修改主键列会花费很大的代价。
Secondary index:a type of innodb index ,聚集索引之外的索引,一个表可以设置0+个此种索引。
Segment:表空间的分割段。在file-per-table表空间中,表数据在一个segment里,每个相关的索引在其自己的segment里。System tablespace包含了很多不同的segment,也会包含用于undo logs的rollback segment。
Rollback segment:包含了undo log,系统表空间的一部分。
tablespace:一个可以持有一个或多个数据表和相关索引的文件。
ibdata file:一组这样的文件:ibdata1,ibdata2..等等。其组成了系统的表空间。也可能会包含部分或所有表数据(取决于file-per-table模式是否开启)。当innodb_file_per_table选项开启,新创建的数据和索引会保存在单独的 .ibd 文件中,而不是在systemtablespace中。
由innodb_autoextend_increment配置选项控制。
ibtmp file:临时的表空间数据文件。
ib_logfile:一个文件组,通常这样命名:ib_logfile0 和 ib_logfile1,其构成了redo log。
redo log :基于磁盘的数据结构。用于故障恢复,保证不完整事务写入数据的正确性。
.frm file :包含了mysql 表的元数据 ,例如:表的定义。但对于InnoDB引擎来说,虽然也拥有.frm文件,但是表的元数据却在system tablespace。

InnoDB引擎架构的主要组件构成