InnoDB 架构

241 阅读3分钟

一 概述

如上图所示,mysql的InnoDB存储引擎架构,包括了内存架构和磁盘架构两部分。其中,内存架构部分包括:缓冲池(Buffer Poll)、修改缓冲区(Change Buffer)、自适应hash索引(Adaptive Hash Index)、日志缓冲区(Log Buffer)。磁盘架构包括:表、索引、表空间、双写缓冲区(Doublewrite Buffer)、重做日志(Redo Log)、撤销日志(Undo Logs)。

本章将阐述Mysql InnoDB的架构中的组成部分,并在后续系列文章中详细描述各部分的细节。

2.1 缓冲池(Buffer Pool)

缓冲池是InnoDB位于主存储器中的一片区域,用于缓存访问过的表和索引数据。缓冲池允许直接从内存处理频繁使用的数据,这加快了处理速度。在专用服务器上,通常高达80%的物理内存会分配给缓冲池。

为了提高大容量读操作的效率,缓冲池被分割成一个个可以容纳多行的页(pages)。为了方便缓存管理,缓冲池被实现成页的链表结构;很少使用的数据会使用LRU算法的一种变体从缓存中淘汰。

了解如何利用缓冲池将频繁访问的数据保存在内存中,是MySQL调优的一个重要方面。

2.2 修改缓冲区

修改缓冲区是一个特殊的数据结构,用于缓存不在缓冲池中的那些二级索引页的变更。由insert, update或delete这些dml操作导致被缓存的变化,将在当这些页被其他读操作加载到缓冲池后合并。

修改缓冲区结构

2.3 自适应hash索引

自适应散列索引特性,使InnoDB在具有适当的负载组合和充足的缓冲池内存的系统上,执行得更像内存数据库,而不会牺牲事务特性或可靠性。自适应哈希索引特性通过变量: innodb_adaptive_hash_index开启,或在服务启动时通过--skip-innodb-adaptive-hash-index参数关闭。

根据观察到的搜索模式,hash索引是使用索引key的前缀来创建的。前缀可以是任意长度,并且可能只有B树中的一些值出现在哈希索引中。哈希索引是根据需要为经常访问的索引页构建的。

2.4 日志缓冲

日志缓冲区是保存即将写入磁盘上日志文件的数据的内存区域。日志缓冲区大小由变量innodb_log_buffer_size定义。默认的大小是16MB。日志缓冲区的内容定期刷新到磁盘。大的日志缓冲区能够在事务提交前无需写入redo日志数据到磁盘的情况下执行大事务。因此,如果你有更新、插入、删除很多行记录的事务,可以通过增加日志缓冲区的大小来减少磁盘I/O。

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