InnoDB的内存结构及特性

  介绍

本篇内容介绍了“InnoDB的内存结构及特性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

<节> <人物>,,,,常言说得好,每个成功男人背后都有一个为他默默付出的女人,而对于MySQL来说,这个“人”就是InnoDB存储引擎。   ,
, <人物> ? MySQL区别于其他数据库的最为重要的特点就是其插件式的表存储引擎。   ,而在众多存储引擎中,InnoDB是最为常用的存储引擎。   ,从MySQL5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。   ,
,

? InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计,支持外键,并支持非锁定读,即默认读操作不会产生锁。


? InnoDB通过使用多版本并发控制(MVCC)来获取高并发性,并且实现了SQL标准的4中隔离级别,默认为可重复级别。同时,使用一种被称为next-key-locking的策略来避免幻读现象的产生。除此之外,InnoDB存储引擎还提供了插入缓冲(插入缓冲),二次写(双写),自适应哈希索引(自适应哈希索引),预读(读之前)等高性能和高可用的功能。

<人物>  InnoDB的内存结构及特性”> <br/> </图> <br/> ?上图详细显示了InnoDB存储引擎的体系架构,从图中可见,InnoDB存储引擎由内存池,后台线程和磁盘文件三大部分组成。接下来我们就来简单了解一下内存相关的概念和原理。
  ,
  ,<h5>缓冲池</h5> <p> ? InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。但是由于CPU的速度和磁盘速度之间的鸿沟,基于磁盘的数据库系统通常使用缓冲池记录来提高数据库的的整体性能。</p> <p> ?在数据库中进行读取操作,首先将从磁盘中读到的页放在缓冲池中,下次再读相同的页中时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否,则读取磁盘上的页。</p> <p> ?对于数据库中页的修改操作,则首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上。页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过一种称为检查点的机制刷新回磁盘。</p> <p> ?所以,缓冲池的大小直接影响着数据库的整体性能,可以通过配置参数通过innodb_buffer_pool_size来设置。</p> <p> ?具体来看,缓冲池中缓存的数据页类型有:索引页,数据页,撤销页,插入缓冲(插入缓冲),自适应哈希索引(自适应哈希索引),InnoDB存储的锁信息(锁信息)和数据字典信息(数据字典)。</p> <p> ?在架构图上可以看的到,InnoDB存储引擎的内存区域除了有缓冲池之外,还有重做日志缓冲和额外内存池.InnoDB存储引擎首先将重做日志信息先放到这个缓冲区中,然后按照一定频率将其刷新到重做日志文件中。重做日志缓冲一般不需要设置的很大,该值可由配置参数innodb_log_buffer_size控制。</p>, <h5>数据页和索引页</h5> <p> ?页面是InnoDB存储的最基本结构,也是InnoDB磁盘管理的最小单位,与数据库相关的所有内容都存储在页面结构里.Page分为几种类型,数据页和索引页就是其中最为重要的两种类型。</p>, <h5>插入缓冲(插入缓冲)</h5> <p> ?我们都知道,在InnoDB引擎上进行插入操作时,一般需要按照主键顺序进行插入,这样才能获得较高的插入性能。当一张表中存在非聚簇的且不唯一的索引时,在插入时,数据页的存放还是按照主键进行顺序存放,但是对于非聚簇索引叶节点的插入不再是顺序的了,这时就需要离散的访问非聚簇索引页,由于随机读取的存在导致插入操作性能下降。</p> <p> ?InnoDB为此设计了插入缓冲来进行插入优化。对于非聚簇索引的插入或者更新操作,不是每一次都直接插入到索引页中,而是先判断插入的非聚集索引是否在缓冲池中,若在,则直接插入;若不在,则先放入到一个插入缓冲中。看似数据库这个非聚集的索引已经查到叶节点,而实际没有,这时存放在另外一个位置,然后再以一定的频率和情况进行插入缓冲器和非聚簇索引页子节点的合并操作。这时通常能够将多个插入合并到一个操作中,这样就大大提高了对于非聚簇索引的插入性能。</p>, <h5>两次写(双写)</h5> <p> ?如果说插入缓冲给InnoDB存储引擎带来了性能上的提升,那么双写带给InnoDB存储引擎的是数据页的可靠性。<br/> </p> <人物> <img src=InnoDB的内存结构及特性