Innodb概述
该存储引擎是第一个完整支持ACID事 务的MySOL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及使用内存和CPU;
体系结构如下:
InnoDB存储引擎有多个内存块,这些内存块组成一个内存池,主要负责如下工作:
- 维护所有进程、线程需要访问的多个内部数据结构
- 缓存磁盘上的数据,方便快速读取,同时在对磁盘文件的数据修改之前在这里缓存
- 重做日志(redo log)缓冲
后台线程的主要作用:
负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据
将已修改的数据文件刷新到磁盘文件
innodb 内存结构
缓冲池
InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此 可将其视为基于磁盘的数据库系统 (Disk-baseDatabase)。在数据库系统中,由于CPU 速度与磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缇冲池技术来提高数据库 的整体性能 .
缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲他中 这个过程称为将页“FIX”在缓冲池中。下一次再读相同的页时,首先判断该页是否在 缓冲他中,若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘 上的页 .
对于数据库中页的修改操作,则首先修改在缓冲池中的页,然后再以一定的频率刷 新到磁盘上,这里需要注意的是,页从缓冲池剧新回磁盘的操作并不是在每次页发生更新时触发,而是通过一种称为Checkpoint的机制刷新, 提高据库的整体性能
综上所述,缓冲池的大小 直接影响着数据库的整体性能。
SHOW VARIABLES LIKE 'innodb_buffer_poo1_size' \G;
缓冲池管理 LRU Free Flush
LRU list
通常来说 数据库中的缓冲池是通过LRU (Latest Recent Used, 最近最少使用》 算法来进行管理的, 即最频繁使用的页(一页16k)在LRU列表的前端,而最少使用的页在 LRU列表的尾端, 当缓冲池不能存放新读取到的页时 将首先释放LRU列表中尾 端的页.
Buffer Pool的LRU算法与普通的LRU算法不一样,新数据页插入时并不从头部插入,而是从中间位置插入(默认配置下,该位置从表头计算为列表5/8的位置),在该位置,列表被分成了如下两个子列表:
- 在头部是最近被访问的新页列表
- 在尾部是很少被访问的旧页列表
可以和jvm的young区 old区类比。
为什么这么设计??
直接将读取的页放人到LRU列表的首部呢?这是因为若直接将读取到的页放人到LRU的首部,那么某些SQL操作可能会使缓冲池中 的页被刷新出,从而影响缓冲池的效率。常见的这类操作为索引或数据的扫描操作。这 类操作需要访问表中的许多页,甚至是全部的页,而这些页通常来说又仅在这次查询操 作中需要,并不是活跃的热点数据。如果页被放人LRU列表的首部,那么非常可能将 所需要的热点数据页从LRU列表中移除,而在下一次需要读取该页时, InnoDB存储引 肇需要再次访问磁盘
查看内存状态
Checkpoint
Checkpoint(检查点)技术的目的是解决以下几个间题
缩短数据库的恢复时间
绥冲池不够用时,将脏页刷新到磁盘
重做日志不可用时,刷新脏页
当数据库发生容机时,数据库不需要重做所有的目志,因为Checkpoint之前的页都 已经刷新回磁盘。故数据库只需对Checkpoint后的重做目志进行恢复。这样就大大缩短 了恢复的时间.