加入收藏 | 设为首页 | 会员中心 | 我要投稿 锡盟站长网 (https://www.0479zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

InnoDB储存引擎

发布时间:2022-03-02 15:11:29 所属栏目:MySql教程 来源:互联网
导读:InnoDB是在MySQL存储引擎中第一个完整支持ACID事务的引擎,该引擎之前由Innobase OY公司所开发,后来该公司被Oracle收购。InnoDB是MySQL数据库中使用最广泛的存储引擎,已被许多大型公司所采用,如Google、Facebook、YouTube等,如果使用MySQL数据库服务,
       InnoDB是在MySQL存储引擎中第一个完整支持ACID事务的引擎,该引擎之前由Innobase OY公司所开发,后来该公司被Oracle收购。InnoDB是MySQL数据库中使用最广泛的存储引擎,已被许多大型公司所采用,如Google、Facebook、YouTube等,如果使用MySQL数据库服务,没有特殊的要求下,InnoDB是不二之选。
 
1.InnoDB体系架构
  
      重做日志(redo log)缓冲(简单来讲,redo log记录的是事务所对应的数据更新日志,用于降低每次数据变更都产生的磁盘IO,该日志由工作线程定时把数据的更新内容定时刷新到磁盘中去,当数据库奔溃时数据还没来得及刷新到磁盘,重新启动运行是则可以从redo log里面重新提取刷新到磁盘,具体有关redo log在后面相关章节会详细介绍)。
 
      后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓冲的是最近的数据,此外除将已修改的数据文件刷新到磁盘中,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。
 
2.后台线程
 
master thread
 
     master thread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页面的刷新、合并插入缓冲、undo页的回收等。
 
     事务被提交后,其所使用的undo log(用于事务commit失败后回滚操作用)可能不在需要,因此需要purge线程来回收undo页。在InnoDB 1.1版本之前,purge thread在master thread中完成;而从InnoDB 1.1版本开始,purge操作独立到专门的线程执行,以减轻master thread压力,提升cpu使用率、提升引擎性能;从InnoDB 1.2版本开始,还支持多个purge thread以进一步加快undo页回收。
 
page cleaner thread
 
在InnoDB 1.2.x版本中引入,其作用是将之前版本中脏页面是刷新操作都放在独立的线程中完成,也是为了减轻master thread的压力,提升性能。
 
3.内存
 
缓冲池
 
InnoDB引擎的数据存储是基于磁盘的,把记录按照一定的格式记录在磁盘,但是由于CPU与磁盘的速度有较大的差别,因此引入了基于内存缓冲技术来提高数据库的性能。简单来讲,把要读取数据的磁盘内容先加载到内存缓冲区域,下次读取同样数据时先判断是否被缓冲区所缓存,如果缓存则从缓冲区读取内容;同样,当需要对数据进行修改时,不直接修改磁盘对应数据,而是先修改缓冲区域,然后通过一种叫checkpoint(具体后面会介绍)的机制把更新的数据刷新到磁盘。
 
内存管理 LRU List、Free List、Flush List
 
通常来说,数据库中的内存缓冲区是通过LRU(Latest Recent Used,最近最少使用)算法来进行管理。即频繁使用的页在LRU列表的前端,而最少使用的页在LRU的尾端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表尾端的页。
 
在InnoDB引擎中,缓冲池中页的大小默认是16KB,同样也是使用LRU算法来进行管理,稍有不同的是,引擎对传统的LRU算法进行了一些优化,当读取到新的页,但并不是直接插入到LRU列表的首部,而是插入到LRU列表的midpoint位置,这个位置可以通过参数innodb_old_blocks_pct控制,默认情况下这个数值是37,代表插入到LRU列表尾部的37%的位置。关于InnoDB下LRU的算法不在本文详细讲解,有兴趣的读者可以自行查阅相关资料。
 
介绍完LRU List,下面介绍Free List,Free列表保存的是空闲页,引擎需要从缓冲池中分页时,首先从Free列表中查找是否有空闲页,若有则把页从Free List获取然后删除放到LRU List中,同理当LRU List的页面需要淘汰时则重新加入到Free List。
 
在LRU列表中的页被修改后,程该页为脏页(dirty page),即缓冲池中的页和磁盘上的页数据产生了不一致,这时候数据库会通过checkpoint机制将脏页刷新回磁盘(关于checkpoint在下一节会介绍),而Flush List则是专门保存这些脏页的列表。

(编辑:锡盟站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!