InnoDB存储结构
1.3.2 InnoDB存储结构
从MySQL 5.5版本开始默认使用InnoDB作为引擎,它擅长处理事务,具有自动崩溃恢复的特性。下面是官方的InnoDB引擎架构图,主要分为内存结构和磁盘结构两大部分
1.3.2.1 InnoDB内存结构(包含四大组件)
内存结构主要包括buffer Pool, Change Buffer, Adaptive Hash Index和log buffer四大组件
1.3.2.1.1 Buffer Pool(缓冲池)
简称BP,BP以Page页为单位,默认大小16K,底层采用了链表数据结构管理Page,在InnoDB访问记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率
page管理机制可以分为三种类型 a. free page(空闲) b. clean page(被使用page) c. dirty page(dirty page)
1.3.2.1.2 Change Buffer(写缓存区)
简称CB, 在进行DML(增删改) 操作时,如果BP没有其相应的Page数据,并不会立刻将磁盘页加载到缓冲池,而是在CB记录缓冲变更,等未来数据被读取时,再将数据合并恢复到BP中
changeBuffer占用bufferPool空间,默认占25%,最大允许占50%,当更新一条记录时,该记录在bufferPool存在,直接在BufferPool修改,一次内存操作,如果该记录在bufferPool不存在(没有命中),会直接在ChangeBuffer进行一次内存操作,不用再去磁盘查询数据,避免一次磁盘,当下次查询记录时,会先进行磁盘读取,然后再从channgeBuffer中读取信息合并,最终载入BufferPool中
写入缓冲区,仅使用于非唯一普通索引页,为什么?
如果在索引设置唯一性,在进行修改时,InnoDB必须要做唯一性效验,因此必须查询磁盘,做一次IO操作,会直接将记录查询到BufferPool中,然后在缓冲池修改,不会在ChangeBuffer操作
1.3.2.1.3 Adaptive Hash Index(自适应哈希索引)
用于优化对BP数据的查询,InnoDB存储引擎会监控对表索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应InnoDB存储引擎会自动根据访问的频率和模式来为某些页建立hash索引
1.3.2.1.4 log buffer(日志缓存区)
日志缓冲区,用来保存要写入磁盘上log文件(Redo/Undo)的数据,日志缓冲区的内容定期刷新到磁盘Log文件中,日志缓冲区满时会自动将其刷新到磁盘,当遇到BLOB或多行更新的大事务操作时,增加日志缓冲区可以节省磁盘I/O
LogBuffffer主要是用于记录InnoDB引擎日志,在DML操作时会产生Redo和Undo日志。
LogBuffffer空间满了,会自动写入磁盘。可以通过将innodb_log_buffffer_size参数调大,减少磁盘IO频率
innodb_flflush_log_at_trx_commit参数控制日志刷新行为,默认为1
0: 每隔1秒写日志文件和刷盘操作(写日志文件LogBuffffer-->OS cache,刷盘OS cache-->磁盘文件),最多丢失1秒数据
1:事务提交,立刻写日志文件和刷盘,数据不丢失,但是会频繁IO操作
2:事务提交,立刻写日志文件,每隔1秒钟进行刷盘操作
1.3.2 InnoDB磁盘结构
InnoDB磁盘主要包含Tablespaces,InnoDB Data Dictionary,Doublewrite Buffffer、Redo Log 和Undo Logs。