MySQL Innodb引擎体系结构

Innodb 主要组成部件:
1.Buffer Pool
2.Change Buffer
3.Adaptive Hash index
4.Redo Log Buffer
5.System Tablespace
6.Innodb Data Dictionary
7.Doublewrite Buffer
8.Undo Logs
9.File-Per-Table Tablespace
10.Undo Tablespace
11.Temporary Tablespace

一、Buffer Pool(缓冲池)
Innodb会将需要访问或处理的数据,先缓存在Buffer Pool中。Buffer Pool中以页为单位进行缓冲,同时将缓冲中的页映射为指针链接列表,依据LRU算法来将最少使用的页age out。由此,Buffer Pool通过缓冲热数据,在内存中进行读写,加快了处理速度。

二、Change Buffer(更新缓冲区)
当二级索引页需要更新,但这些索引页并不在Buffer Pool中,Innodb就会将这些页的更改缓冲到Change Buffer,后续其他操作将这些索引页加载到Buffer Pool时,那些缓冲的更改就会合并在一起,作用到相应的索引页上。
二级索引通常是不唯一的,且相对于表数据来说,是随机分布的。那么将change合并集中地执行,比每一次更新去随机地找索引条目,高效得多。

三、Adaptive Hash index(自适应哈希索引)
哈希索引的局限性比较大,在模糊查询如like和%通配符,以及范围查询都无法用上哈希索引。

四、Redo Log Buffer(redo缓冲区)
顾名思义,即是redo在写入磁盘前缓冲的区域,大小由参数innodb_log_buffer_size决定。Innodb会阶段性地将Redo Log Buffer数据刷到磁盘文件上,一个大事务所产生的大量redo,可能会导致在事务提交前,redo buffer数据刷盘多次,所以增大redo buffer在大事务环境下,可以减少redo写盘次数,节省IO。
参数innodb_flush_log_at_trx_commit控制redo在事务提交后怎么处理redo buffer的数据,是每个事务提交后马上刷盘,还是多个事务提交后再刷盘等;
参数innodb_flush_log_at_timeout控制redo buffer自动刷盘频率。

五、System Tablespace(系统表空间)
System Tablespace包含了一些数据字典以及为doublewrite buffer,change buffer和undo logs提供存储空间。同时还包含用户创建在系统表空间的数据表或索引,如果没有指定innodb_file_per_table,则用户的数据默认存放在系统表空间中。
系统表空间可以存放在一个或多个文件,通常名字为ibdata1,ibdata2等,通过innodb_data_file_path设置。

六、Innodb Data Dictionary(innodb数据字典)
数据字典记录了数据库对象的元数据,例如表,列,索引的定义等,物理上是存储在系统表空间中。innodb在.frm文件中也会记录相关的元数据,和数据字典有重叠的内容。

七、Doublewrite Buffer(双写缓冲区)
双写缓冲区,即是在将buffer pool中的数据写入磁盘文件前,先将这些数据写入doublewrite buffer。buffer pool中的所有数据,必须先写入doublewrite buffer,然后再从doublewrite buffer中写入磁盘文件。
doublewrite buffer是为了解决partial page write的问题,什么是partial page write?例如一个页的大小为8K,在写入前面4K时,数据库突然crash了,那么这个页也就只写入一部分。在这种情况下,如果有doublewrite buffer,在重启后,只要在doublewrite buffer中找回后面的4K数据就可以了。既然重启后还能通过doublewrite buffer找回数据,就说明doublewrite buffer是永久记录在磁盘文件上的,是的,就存储在系统表空间ibdata中。
那么doublewrite是否比直接写入磁盘多一倍的IO呢?不是的,doublewrite buffer在系统表空间中是一整块顺序的chunk,数据写入doublewrite buffer时,只需要调用一次fsync即可。
doublewrite buffer是默认开启的。

八、Undo Logs(回滚日志)
innodb支持事务,那么事务的rollback即是通过undo log来实现的,用来回退事务中的变更。undo log是一个事务所有undo log record的集合。同时,undo log也用作多版本查询(MVCC)。

九、File-Per-Table Tablespace(独立表空间)
前面提到,innodb默认情况下用户的数据都存放在系统表空间中。但如果指定了innodb_file_per_table,那么用户的每个表都会独立使用一个表空间,对应独立的磁盘文件。

十、Undo Tablespace(回滚表空间)
即是用来存放undo log的表空间,默认是系统表空间,可以通过innodb_undo_tablespaces将其独立出来。

十一、Temporary Tablespace(临时表空间)
用户创建的临时表以及内部临时磁盘表,都存放在一个共享的临时表空间里,可以通过innodb_temp_data_file_path指定表空间存放路径,文件名,大小等属性,默认是在数据目录下的ibtmp文件。
临时表空间会在重启时清理并重新创建,但如果无法创建临时表空间,将无法启动数据库。

你可能感兴趣的:(MySQL)