微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

《MySQL运维内参》节选

《《MysqL运维内参》节选》要点:
本文介绍了《MysqL运维内参》节选,希望对您有用。如果有疑问,可以联系我们。

本文上接 InnoDB日志管理机制(一),继续分析buffer pool:

buffer pool

一个BufferPool实例中的所有控制头信息连续存储在一起,所以控制信息存储完成之后才是真正的缓冲页面,下图表示的是一个BufferPool实例的内存分布情况.

BufferPool

对于BufferPool中的所有页面,都有一个控制头信息与它对应,从上图可以看出,每一个ctl都表示了一个属于自己的page使用情况.初始化实例时当然还需要对每一个控制头信息进行初始化,也就是每一个buf_block_t结构.初始化一个页面控制信息是通过buf_block_init函数实现的,buf_block_t结构中包含了很多信息,主要包括如下4部分.

  1. 其对应的页面地址frame.
  2. 页信息结构buf_page_t,这个结构用来描述一个页面的信息,包括所属表空间的ID号、页面号、被修改时产生的LSN(newest_modification及oldest_modification)、使用状态(现在共有9种状态)等(上面已经介绍过与buf_block_t的关系).
  3. 用来保护这个页面的互斥量mutex.
  4. 访问页面时对这个页面上的锁lock(read/write)等.

在初始化完每一个页面之后,需要将每一个页面加入到上面提到的空闲页链表中,因为这些页面现在的状态都是未使用(BUF_BLOCK_NOT_USED).

到现在为止,缓冲池的一个实例就算初始化完成了,在访问数据库的时候会通过这些内存页面来缓存文件数据.

相对于整个Buffer Pool而言,多个Buffer Pool实例之间的关系,需要在这里再讲述一下.上面所说的单个实例的初始化,是完全独立的,多个实例之间没有任何关系,单独申请、单独管理、单独刷盘,可以从其实现的代码中看到这一点,代码如下.

《MySQL运维内参》节选

代码

代码中可以看出,每一个Buffer Pool实例在整个Buffer Pool中确实是完全独立的,而在具体使用时,针对不同页面,通过一个HASH算法,来映射到一个具体的实例中,对应的代码如下.

代码

通过Buffer Pool多实例的管理机制,可以减少系统运行过程中不同页面之间一些操作的相互影响,从而很好地解决了由于页面间的资源争抢导致的性能低下的问题,所以在实际的运维过程中,建议要分多实例的管理方式,把MysqL及InnoDB用好,让业务少一些烦恼.

本文先到这里,下次开始讲REDO LOG,那是一大块…….

文章来自微信公众号:DBAce

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐