目录

6.1 内存结构

主要包括Buffer Pool、Change Buffer、Adaptive Hash Index和Log Buffer四大组件

6.1.1 Buffer Pool

Buffer Pool(缓冲池)是InnoDB存储引擎中非常重要的内存结构,类似Redis一样的作用,原理如图6-1,起到一个缓存的作用。MySQL的数据最终是存储在磁盘中的,如果没有Buffer Pool,那么每次的数据库请求都会磁盘中查找,这样必然会存在IO操作。但是有了Buffer Pool,在第一次查询时就会将查询的结果保存到Buffer Pool中,这样后面再有请求时就会先从缓冲池中去查询,如果没有再去磁盘中查找,然后在放到Buffer Pool。

6.1.2 Change Buffer

(Insert buffer part of buffer pool)这是一种特殊的数据结构(早期只支持INSERT操作的缓冲,所以也叫作Insert Buffer),当受影响的页面不在缓冲池中时,将会缓存对辅助索引页的更改。这些更改可能是由INSERT、UPDATE、DELETE(DML)语句执行时所导致的,当其他读取操作从磁盘中加载数据页时,如果这些数据页包含Change Buffer中缓存的更改操作页,那么将进行合并操作。

6.1.3 Adaptive Hash Index

自适应哈希索引(AHI),使InnoDB能够在具有适当工作负载组合和足够内存的系统上执行更像内存中数据库的操作,而不会牺牲事务特性或可靠性。

自适应哈希索引由innodb_adaptive_hash_index变量启用,或在服务器启动时由--skip innodb自适应哈希指数关闭。

6.1.4 Log Buffer

日志缓冲区(Log Buffer)是存储要写入磁盘上日志文件的数据的内存区域。日志缓冲区大小由innodb_Log_buffer_size变量定义,默认大小为16MB。日志缓冲区的内容定期刷新到磁盘。大型日志缓冲区使大型事务能够运行,而无需在事务提交之前将重做日志数据写入磁盘。因此,如果您有更新、插入或删除许多行的事务,那么增加日志缓冲区的大小可以节省磁盘I/O。

innodb_flush_log_at_trx_commit变量控制如何将日志缓冲区的内容写入并刷新到磁盘。innodb_flush_log_at_timeout变量控制日志刷新频率。