innodb存储引擎的体系结构

 Innodb存储引擎有多个内存块,组成了一个 内存池,负责:
       (1)维护所有进程/线程需要访问的多个内部数据结构,
       (2)缓存磁盘上的数据,方便快速的读取,同时对磁盘文件的数据修改之前在这里缓存,
       (3)重做日志缓冲
    
 后台线程:
  后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据,此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下innodb能恢复到正常运行状态,
  InnoDB是多线程的模型,因此后台有很多不同的线程,负责处理不同的任务,
 1.Master Thread
     主要负责将缓冲池的数据异步刷新到磁盘,保证数据的一致性,
 2.io Thread
    在InnoDB存储引擎中大量使用了AIO(异步io)来处理写io请求,这样做极大提高了数据库的性能,而IO Thread的工作主要是负责这些io请求的回调处理,
3.purge Thread
     事务被提交后,其所使用的undo log可能不再需要( http://blog.csdn.net/ggxxkkll/article/details/7616739 ),因此需要purge Thread 来回收已经使用并分配的undo项,在InnoDB1.1版本之前,purge操作仅在InnoDB存储引擎的Master Thread中完成,从Innodb1.1开始,purge操作可以独立到单独的线程中进行,减轻Master Thread的工作,通过在mysql配置文件中添加以下命令来启用独立的purge Thread线程:
[mysqld]
  innodb_purge_threads=1
在innodb1.1版本中,设为大于1,innodb启动时也会将其设为1,并在错误文件中出现错误提示,从2.2版本开始,innodb支持多个purge thread,为了进一步加快undo页的回收,
4.page cleaner Thread
     在innodb1.2.x版本中引入,其作用是将之前版本的脏页的刷新操作都放到单独的线程来完成,提高性能,

内存:
   1.缓冲池
      Innodb存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理,因此可将其视为基于磁盘对的数据库系统 ,由于cpu和磁盘之间速度的差距,所以基于磁盘的数据库系统通常使用缓冲池技术来提高数据库的性能,
     缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对于数据库性能的影响,在数据库中进行读取页的操作,首先将从磁盘读取到页存放在缓冲池中,下一次在读相同的页时,首先判断该页是否在缓冲池中,在则命中,直接读取,不再则读取磁盘上的页,
     缓冲池在32位系统下最多将大小设置为3G,对于InnoDB存储引擎而言,其缓冲池的配置通过参数innodb_buffer_pool_size来设置,缓冲池中数据页类型有:索引页、数据页、undo页、插入缓冲、自适应哈希索引、innodb存储的锁信息、数据字典信息等,

 
从Innodb1.0.x版本开始,允许有多个缓冲池实例,每个页根据哈希值平均分配到不同缓冲池实例中,通过innodb_buffer_pool_instances来进行配置,该值默认为1。

  2.LRU list、Free list和flush list
    数据库中的缓冲池是通过LRU(最近最少使用)算法来进行管理的,
    在Innodb存储引擎中,缓冲池的页的大小默认为16KB,也是通过LRU算法进行管理,不过对传统的LRU算法进行了一些优化,在LRU列表中加入了midpoint位置,还引入另一个参数innodb_old_blocks_time,用于表示页读取到mid位置后需要等待多久才会被加入LRU列表的热端,       
     在LRU列表中的页被修改后,称该页为脏页,即缓冲池中的页和磁盘上的页的数据产生了不一致,这时数据库会通过 CHECKPOINT机制将脏页刷新回磁盘,而FLUSH列表中页即为脏页列表,脏页即可能存在于LRU列表中,也有可能存在于FLUSH列表中,LRU列表用来管理缓冲池中页的可用性,FLUSH列表用来管理将页刷新回磁盘,
3.重做日志缓冲
    InnoDB存储引擎的内存区域除了缓冲池外,还有重做日志缓冲,首先将重做日志信息先放入到这个缓冲区,然后按照一定的频率 将其刷新到重做日志文件,缓冲不用设置的很大,因为一般每一秒钟会将重做的日志缓冲刷新到日志文件 ,缓冲区大小可由参数innodb_log_buffer_size参数控制,默认为8MB,

4.额外的内存池
    在innodb存储引擎中,对内存的管理是通过一种称为内存堆的方式进行的,在对一些数据结构本身的内存进行分配时,需要从额外的内存池中进行申请,当该区域内存不够时,会从缓冲池中进行申请

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值