学习Mysql有一段时间了,对SQL语法、索引、查询优化做了一定的了解,但是总感觉浮于表面,所以想换一种角度去理解Mysql-它的存储实现引擎:InnoDB。InnoDB是Mysql5.5之后默认的存储引擎,本文也主要是参照Mysql5.6的官方手册。
一、存储引擎的作用是什么?
在深入讨论InnoDB前,想先讨论以下存储引擎的作用。数据库是我们用来组织和存储数据的工具,在Mysql系统的三层结构中,数据的组织和存储主要由存储引擎层实现。我们知道,Mysql的数据是存在磁盘中,数据的计算是在内存中,所以存储引擎的作用的作用主要在三个方面:内存中的结构、磁盘中的结构和内存与磁盘的数据交换。
二、InnoDB的整体架构
这是一张Mysql官网的图,我们先对图中的各个名词及作用做一个解释,方便后续的理解:
- 页:Mysql中存储、读取数据的单元,默认值是16KB,可以通过
innodb_page_size参数调整 - Buffer Pool:缓存索引和表数据的内存区域,缓存的基本单元是页,页采用LRU算法进行更换。
- Change Buffer:逻辑上是Buffer Pool的一部分,属于一种特殊的数据结构,当辅助索引页不在缓冲池中时,它会将更改缓存到辅助索引页。由插入、更新或删除操作(DML)引起的缓冲更改将在稍后由其他读取操作将页加载到缓冲池中时合并。
- Log Buffer:日志缓冲区是存储要写入磁盘日志文件的数据的内存区域。日志缓冲区大小由innodb_Log_buffer_size变量定义。默认大小为16MB。日志缓冲区的内容定期刷新到磁盘。大型日志缓冲区使大型事务能够运行,而无需在事务提交之前将重做日志数据写入磁盘。
innodb_flush_log_at_trx_commit控制Log Buffer刷新到磁盘的时机,默认是事务提交时刷新,innodb_flush_log_at_timeout控制Log Buffer刷新到磁盘的频率,默认值是1秒。 - adaptive hash index:当InnoDB注意到某些值被引用的非常频繁时,他会在内存中基于B-Tree索引之上再创建一个哈希索引,让B-Tree索引也具备一些哈希索引的优点,比如访问速度快等。这是一个完全自动的过程,可以通过
innodb_adaptive_hash_index参数控制是否启用自适应哈希索引功能。 - System Tablespace:是InnoDB数据字典、Doublewrite Buffer、Change Buffer和Undo Logs的存储区域。如果表是在系统表空间中创建的,而不是在每个表空间中创建文件,则它还可能包含表和索引数据。