设为首页 加入收藏

TOP

InnoDB存储引擎概述
2018-03-22 08:49:23 】 浏览:51
Tags:InnoDB 存储 引擎 概述

InnoDB存储引擎

InnoDB存储引擎概述

InnoDB存储引擎从MySQL5.5版本开始是默认的存储引擎(之前的版本InnoDB存储引擎仅在Windows下是默认的存储引擎),该存储引擎是第一个完整支持ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读、同时被设计用来最有效的利用以及使用内存和CPU。

InnoDB存储引擎的版本

从MySQL5.1版本开始,MySQL数据库允许存储引擎开发商以动态方式加载引擎,这样存储引擎的更新可以不受MySQL数据库版本的限制。所以在MySQL5.1版本中,可以支持两个版本的InnoDB,一个是静态编译的InnoDB版本,另一个是动态加载的InnoDB版本。MySQL5.5版本中将InnoDB的版本升级到了1.1.x,而在最近的MySQL5.6版本中InnoDB的版本也随着升级为1.2.x版本。

InnoDB体系架构

InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责维护所有进程/线程需要访问的多个内部数据结构;缓存磁盘上的数据,方便快速的读取,同时在对磁盘文件的数据修改之前在这里缓存;重做日志缓存等等。

后台线程的主要作用是负责刷新内存池中的数据,保证缓存池中的内存缓存的是最近的数据;此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。

后台线程

InnoDB存储引擎是多线程模型,因此其后台有多个不同的后台线程,负责处理不同的任务:

Master Thread

Master Thread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。

IO Thread

InnoDB存储引擎中大量使用了Async IO来处理写IO请求,这样可以极大提高数据库的性能,而IO Thread的主要工作是负责这些IO请求的回调处理,可以使用show engine innodb status命令查看InnoDB存储引擎中的IO进程:

mysql> show engine innodb status\g;

I/O thread 0 state: waiting for i/o request (insert buffer thread)

I/O thread 1 state: waiting for i/o request (log thread)

I/O thread 2 state: waiting for i/o request (read thread)

I/O thread 3 state: waiting for i/o request (read thread)

I/O thread 4 state: waiting for i/o request (read thread)

I/O thread 5 state: waiting for i/o request (read thread)

I/O thread 6 state: waiting for i/o request (write thread)

I/O thread 7 state: waiting for i/o request (write thread)

I/O thread 8 state: waiting for i/o request (write thread)

I/O thread 9 state: waiting for i/o request (write thread)

Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,

ibuf aio reads:, log i/o’s:, sync i/o’s:

Pending flushes (fsync) log: 0; buffer pool: 0

451 OS file reads, 54 OS file writes, 7 OS fsyncs

3.77 reads/s, 16384 avg bytes/read, 1.05 writes/s, 0.13 fsyncs/s

Purge Thread

事务被提交后,其所使用的undolog可能不再需要,因此需要PurgeThread来回收已经使用并分配的undo页。从InnoDB1.1版本开始,purge操作可以独立到单独的线程中进行,以此来减轻Master Thread的工作,从而提高CPU的使用率、提升存储引擎的性能。可以通过在MySQL数据库的配置文件中添加相关的命令来启用独立的Purge Thread,略去不表。

Page Cleaner Thread

Page Cleaner Thread是在InnoDB 1.2.x版本中引入的,其作用是将之前版本中的脏页的刷新操作都放入到单独的进程中来完成,目的就是为了减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。

内存

缓冲池

InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理,因此可以将其视为基于磁盘的数据库系统。由于CPU速度与磁盘速度之间的鸿沟,基于磁盘的数据库系统通常会使用缓冲池技术来提高数据库的整体性能。缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。在数据库进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“FIX”在缓冲池中。下一次再读相同页时,首先判断该页是否存在于缓冲池中。若在则称该页在缓冲池中被命中,直接读取该页,否则,读取磁盘上的页。对于数据库中页的修改操作,首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上,需要注意的是,页从缓冲池刷新回磁盘的操作并不是在每次页发生更改时触发,而是通过一种称为CheckPoint的机制刷新回磁盘,这样是为了数据库的整体性能。

LRU List、Free List和Flush List

通常来说,数据库中的缓冲池是通过LRU(Latest Recent Used,最近最少使用)算法来进行管理的,即最频繁使用的页在LRU列表的最前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表尾端的页。各项参数的配置此处略去。

Checkpoint技术

缓冲池设计的目的是为了协调CPU速度与磁盘速度的鸿沟,因此页的操作首先都是在缓冲池中完成的。如果一条DML语句改变了页中的记录,那么此时页是脏的,即缓冲池中的页的版本要比磁盘的新,数据库需要将新版本的页从缓冲池刷新到磁盘。尚若每次一个页发生变化,就将新页的版本刷新到磁盘,那么这个开销是非常巨大的,若热点数据集中在某几个页中,那么数据库的性能将变得非常差;同时,如果在从缓冲池将页的新版本刷新到磁盘的过程中发生宕机,那么数据就不能恢复。为了避免数据丢失的问题,当前事务数据库系统普遍都采用了Write Ahread Log策略,通过重做日志来完成完成数据的恢复,这也是事务ACID中的Durability的要求。

CheckPoint技术的目的是解决以下的几个问题:

缩短数据库的恢复时间 缓冲池不够用时,将脏读刷新到磁盘 重做日志不可用时,刷新脏页

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇如何解决sqlserver中大小写不敏感.. 下一篇mysql使用leftjoin连接出现重复记..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目