思考mysql内核之初级系列4--innodb缓冲区管理.doc

思考mysql内核之初级系列4--innodb缓冲区管理.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
思考mysql内核之初级系列4--innodb缓冲区管理

思考mysql内核之初级系列4--innodb缓冲区管理 我们在前面讨论了一些mysql的基础知识,现在将要开始进入innodb引擎,从这里开始我们将开始代码的结构分析,innodb的内容分析之后,将反过来分析查询优化引擎。今天,我们先来讨论innodb缓冲区管理。 文件: D:\mysql-5.1.7-beta\storage\innobase\include\buf0buf.h D:\mysql-5.1.7-beta\storage\innobase\buffer \buf0buf.c Bingxi和alex开始交流innodb缓冲区结构(不考虑AWE的情况)。 Bingxi:“alex,咱们都知道所谓缓冲区就是将文件缓存,避免重复操作数据文件,这样可以有效地减少io。” Alex:“是的,没错。缓冲区的大小是根据配置文件生成,配置文件中innodb_buffer_pool_size文件,除以16k就得到了对应的页面数。” Bingxi:“嗯,是的。我们现在在debug的情况进行调试,显示的缓冲的页数为512页。也就是我们能够缓存的数据大小为512*16k=8M。这我们可以通过命令行来验证下。我们可以看到设置的大小为8388608,也就是8M,以16k一页计算,也就是512页。 mysql show variables like innodb_buffer_pool_size; +++ | Variable_name | Value | +++ | innodb_buffer_pool_size | 8388608 | +++ 1 row in set (0.00 sec) 执行show innodb status\G;查看其中的片段。从中可以看出buffer pool size果然为512,不过呢,我怎么看到free buffers为493,也就是有19页是使用。这个就奇怪,我没有执行查询语句啊。 BUFFER POOL AND MEMORY Total memory allocated in additional pool allocated 176384 Buffer pool size 512 Free buffers 493 Database pages 19 Modified db pages 0 Pending reads 0 Pending writes: LRU 0, flush list 0, single page 0 Pages read 19, created 0, written 0 0.00 reads/s, 0.00 creates/s, 0.00 writes/s No buffer pool page gets since the last printout ” Alex:“因为innodb会有自己的一些系统表需要加载,也就是所谓的字典表。这个内容我们在以后讨论” Bingxi:“嗯,好的,alex。咱们继续看buf0buf.h文件,我看buf_pool_struct是缓冲区的总结构。在其中记录了缓冲数据页管理、访问计数、LRU列表管理等等。我们先讨论下该结构的下面4个变量吧。 struct buf_pool_struct{ …… byte* frame_mem; byte* frame_zero; byte* high_end; ulint n_frames; …… }; ” Alex:“好吧,我们对着代码看吧。其实frame_mem就是分配的缓冲区的指针,但是这个指针不一定是16k对齐的,为了提升性能,进行了16k对齐,并将该值赋给frame_zero。high_end作为标识缓冲区的结尾。n_frames表示缓冲页的大小。 buf_pool_t* buf_pool_init( ulint max_size, ulint curr_size, ulint n_frames) //这三个值,在这里都是相等的。为了方便查看去掉了英文注释,建议对照代码 { …… //果然buf_pool_t是全局缓冲区管理结构,分配全局值buf_pool buf_pool = mem_alloc(sizeof(buf_pool_t)); …… //UNIV_PAGE_SIZE=16k,n_frames=512 //奇怪的是为什么分配了513个页,而不是512个页? buf_pool-frame_me

文档评论(0)

xy88118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档