- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)