专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 InnoDB存储引擎详解

InnoDB存储引擎详解

更新时间:2021-01-14 17:10:06 来源:动力节点 浏览846次

InnoDB存储引擎是MySQL众多存储引擎中非常特别的一个,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读、同时被设计用来最有效的利用以及使用内存和CPU。从Mysql5.5版本开始,InnoDB是默认的表存储引擎,本文我们就来详细聊聊InnoDB存储引擎

 

一、InnoDB的体系架构

InnoDB存储引擎有多个内存块,这些内存块组成了一个大的内存池。后台线程主要负责刷新内存池中的数据、将已修改的数据刷新到磁盘等等。

InnoDB后台有多个不同的线程,用来负责不同的任务。主要有如下:

1.Master Thread

这是最核心的一个线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括赃页的刷新、合并插入缓冲、UNDO 页的回收等.

2.IO Thread

在 InnoDB 存储引擎中大量使用了异步 IO 来处理写 IO 请求, IO Thread 的工作主要是负责这些 IO 请求的回调处理。

3.Purge Thread

事务被提交之后, undo log 可能不再需要,因此需要 Purge Thread 来回收已经使用并分配的 undo页. InnoDB 支持多个 Purge Thread, 这样做可以加快 undo 页的回收。

4.Page Cleaner Thread

Page Cleaner Thread 是在InnoDB 1.2.x版本新引入的,其作用是将之前版本中脏页的刷新操作都放入单独的线程中来完成,这样减轻了 Master Thread 的工作及对于用户查询线程的阻塞。

InnoDB 存储引擎是基于磁盘存储的,也就是说数据都是存储在磁盘上的,由于 CPU 速度和磁盘速度之间的鸿沟, InnoDB 引擎使用缓冲池技术来提高数据库的整体性能。缓冲池简单来说就是一块内存区域。在数据库中进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,下一次读取相同的页时,首先判断该页是不是在缓冲池中,若在,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。

 

二、InnoDB的关键特性

Insert Buffer是InnoDB存储引擎关键特性中最令人激动与兴奋的一个功能。不过这个名字可能会让人认为插入缓冲是缓冲池中的一个组成部分。其实不然,InnoDB缓冲池中有Insert Buffer信息固然不错,但是Insert Buffer和数据页一样,也是物理页的一个组成部分。一般情况下,主键是行唯一的标识符。通常应用程序中行记录的插入顺序是按照主键递增的顺序进行插入的。因此,插入聚集索引一般是顺序的,不需要磁盘的随机读取。因为,对于此类情况下的插入,速度还是非常快的。

 

如果说插入缓冲是为了提高写性能的话,那么两次写是为了提高可靠性。其原理是这样的:

1)当刷新缓冲池脏页时,并不直接写到数据文件中,而是先拷贝至内存中的两次写缓冲区。

2)接着从两次写缓冲区分两次写入磁盘共享表空间中,每次写入1MB。

3)待第2步完成后,再将两次写缓冲区写入数据文件。

 

三、InnoDB的CheckPoint技术

CheckPoint技术是用来解决如下几个问题:

1.缩短数据库恢复时间

2.缓冲池不够用时,将脏页刷新到磁盘

3.重做日志不可用时,刷新脏页

缩短数据库恢复时间,重做日志中记录了的checkpoint的位置,这个点之前的页已经刷新回磁盘,只需要对checkpoint之后的重做日志进行恢复。这样就大大缩短了恢复时间。缓冲池不够用时,根据LRU算法,溢出最近最少使用的页,如果页为脏页,强制执行checkpoint,将脏页刷新回磁盘。

 

不得不提的是InnoDB存储引擎作为MySQL的默认存储引擎,与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容事务(Transaction)功能,类似于PostgreSQL。想要深入了解InnoDB存储引擎的小伙伴,快来观看本站的MySQL教程吧!

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>