innodb架构图
5.5以上默认innodb,最大特性是支持事务。
innodb架构主要由两部分组成:in-memory & on-disk,即内存结构和磁盘结构。这里单独介绍一下内存结构。
架构图:
innodb内存结构
1.innodb内存结构由哪几部分组成?各自作用是什么?
由buffer pool(含buffer pool主要部分、change buffer、adaptive hash index)、log buffer。
buffer pool:缓冲池,缓存表和索引数据,减少磁盘io。innodb_buffer_pool_size也是最核心的参数。
change buffer:占用buffer pool一块区域,属于写缓冲区,针对二级索引(辅助索引)页变更的优化措施,5.5之前叫insert buffer(插入缓冲)。在后续通过其他读操作将这些页加载到缓冲池时被合并。innodb_change_buffer_max_size控制了占buffer pool的比例,默认是25,即占25%,最大是50。
adaptive hash index:无法手动创建自适应哈希索引,只能由innodb自动创建。如果innodb发现了通过B+树检索数据效率低且建立自适应哈希索引能优化的话,则会在buffer pool开辟一块区域建立自适应哈希索引。
log buffer:日志缓冲区,缓存将要落盘log文件(包括redo和undo)的数据,log buffer的内容会定期刷新到磁盘的log文件中。定期刷新的机制使得磁盘io次数变少,提高性能。一般log buffer满了会刷一次,或有大事务也会较频繁写入。可适当的调整innodb_log_buffer_size大小以优化,默认128M。
参考架构图左半部分。
2.什么是buffer pool?
缓冲池,缓存表和索引的数据,目的是减少磁盘io。
由两部分组成:
缓存页(page)
innodb以页为单位,对数据进行划分。以页作为磁盘和内存交互的基本单位,默认大小16KB。
在MySQL启动的时候会按配置申请一块连续的内存区域,会按照页大小将buffer pool内存区划分为一个一个的数据页。
包括:数据页、索引页、undo页、插入缓存页、自适应哈希索引、锁信息。控制块
存储缓存页的描述信息:对应缓存页的表空间信息、对应缓存页在buffer pool的地址信息、页编号。
一个缓存页对应一个控制块,是一一对应的关系。
buffer pool默认大小128M,
page默认16K,
控制块一般为页的5%,约800字节。
当我们查询一条数据的时候,会将这条数据所在页从磁盘加载到buffer pool

innodb是如何判断一个页已经在buffer pool中缓存的?
在MySQL中有一个hash表的数据结构,是一个k-v形式,它使用表空间号+当前数据页编号作为一个key,value是缓存页对应的控制块。当我们需要访问某个页的数据时,先从hash表中根据表空间号+数据页编号判断是否有对应的缓存页。如果有,则直接使用;如果没有,则从free链表中选出一个空闲的缓存页




