InnoDB主要数据结构及调用流程
- InnoDB是MySQL中常用的数据引擎。本文将从源码级别对InnoDB重点数据结构和调用流程进行分析。
- 主要数据结构(buf0buf.h)
- Buf_pool
Buf_pool是整个buffer系统中核心数据结构,数据库中所有的操作都会在这缓冲层得到体现。我们可以在配置文件中(InnoDB_buffer_pool_size)指定该缓冲池的大小。
Buffer pool中又包含了多层数据结构:为了实现对buffer_pool的在线大小调整,引入了chunk数据结构;
- Chunk

在chunk数据结构是更具体的内存缓存,主要包含控制内存块的block结构。
Block
Block主要的数据结构是page和frame,这两个结构是用来存储硬盘上的数据库page的。当硬盘存储未使用压缩时,数据会被读取到frame中;当使用压缩后,会存储到page.zip中。
Page结构必须要放在该结构体的第一个位置,方便以后使用指针时可以方便的在page和block间进行转换。
例如:(buf_page_t *) buf_block_t *p
可以得到一个类型为buf_page的指针
- Page
Page结构主要是存储硬盘上的文件,通过space和offset唯一对应到硬盘上的数据库文件;io_fix指出该page的类型(读或写);Zip存储压缩过的page。
- Buf_pool示意图

- Io_threads
在InnoDB内部,使用默认配置参数时,共有10个线程,其中:
4个read线程,4个write线程,负责进行异步的读写操作。
1个log write线程,负责将操作记录进日志文件
1个srv_master线程,负责定时写数据到磁盘等工作。
在InnoDB插件初始化时,会调用innobase_start_or_create_for_mysql,此函数将完成InnoDB存储引擎的初始化工作。创建io threads的部分在函数是os_thread_create(io_handler_thread, n + i, thread_ids + i)其中io_handler_thread是回调函数,主要是为每个后台线程分配任务for (i = 0;; i++) {
fil_aio_wait(segment);mutex_enter(&ios_mutex);
ios++;
mutex_exit(&ios_mutex);
}
fil_aio_wait中起主要作用的是os_aio_simulated_handle,该函数根据线程在InnoDB中的编号进行模拟的异步IO设置。
segment = os_aio_get_array_and_local_segment(&array, global_segment);Aio 与 sync aio
在mysql诞生时,Linux上还未出现AIO机制,于是InnoDB自己实现了一套异步io的框架。
关于Linux aio的介绍,AIO first entered the Linux kernel in 2.5 and is now a standard feature of 2.6 production kernels. http://www.ibm.com/developerworks/linux/library/l-async/最近Innobase在innodb plugin中实现了真正的AIO机制。http://blogs.innodb.com/wp/2010/04/innodb-performance-aio-linux/ 我们会在以后的时间来介绍他。
- Arrays
- os_aio_read_array //异步读
- os_aio_write_array //异步写
- os_aio_ibuf_array //insert bufer
- os_aio_log_array //日志array
- os_aio_sync_array //同步io array
在InnoDB中引入了sync aio,目标是为了在代码级别上与aio的形式保持一致。

为了实现InnoDB的异步IO所引入的数组,系统中一共存在五类数组:
当出现IO请求时,异步机制会将此请求插入其中一个插槽(slot),并等待执行请求的信号;IO完毕,从该插槽中删除。
- Segment
在array中,segment被用作array的标识符,根据segment值可以得到array的种类。例如在默认的array数量下(4个read,4个write)3号表示read array
- Slot
存放异步读写请求的插槽。
- Buf_pool
- 调用流程
在InnoDB中,为了提高响应速度,有时需要立即返回数据,此时采用同步的读机制;而另一些对速度要求不是很高的情况下,例如预读取,InnoDB会采用异步读的方式来加载数据到内存。而在开启double write buffer写数据的情况下,InnoDB会先将数据写一遍到硬盘上某一块称之为double write buffer的区域,然后再在将来某时写到磁盘上,此时会根据系统的当前负载、当前内存中脏的页数有不同的延迟。
异步读写时等待请求:

当缓存块/文件读写完毕时,发出信号:
fil_io() -> os_aio()->
os_aio_simulated_wake_handler_threads()->os_aio_simulated_wake_handler_thread->
os_event_set()->pthread_cond_broadcast()
InnoDB主要数据结构及调用流程的更多相关文章
- socket相关系统调用的调用流程
最近一直在读内核网络协议栈源码,这里以ipv4/tcp为例对socket相关系统调用的流程做一个简要整理,这些相关系统调用的内部细节虽然各有不同,但其调用流程则基本一致: 调用流程: (1)系统调用 ...
- .net core 源码解析-mvc route的注册,激活,调用流程(三)
.net core mvc route的注册,激活,调用流程 mvc的入口是route,当前请求的url匹配到合适的route之后,mvc根据route所指定的controller和action激活c ...
- mvc route的注册,激活,调用流程
mvc route的注册,激活,调用流程(三) net core mvc route的注册,激活,调用流程 mvc的入口是route,当前请求的url匹配到合适的route之后,mvc根据route所 ...
- android从应用到驱动之—camera(1)---程序调用流程
一.开篇 写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧. 话说camera模块,从上层到底层一共包含着这么几个部分: 1.apk------java语言 2.camera的ja ...
- android从应用到驱动之—camera(1)---程序调用流程[转]
一.开篇 写博客还得写开篇介绍,可惜,这个不是我所擅长的.就按我自己的想法写吧. 话说camera模块,从上层到底层一共包含着这么几个部分: 1.apk------java语言 2.camera的ja ...
- 【转】 Android的NDK开发(1)————Android JNI简介与调用流程
原文网址:http://blog.csdn.net/conowen/article/details/7521340 ****************************************** ...
- novaclient的api调用流程与开发
novaclient的api调用流程与开发 2015年07月05日 19:27:17 qiushanjushi 阅读数:3915 http://blog.csdn.net/tpiperatgod/ ...
- Android深入源代码分析理解Aidl总体调用流程(雷惊风)
2017年開始上班的第一天.老不想工作了,假期感觉还没開始就已经结束了,唉,时间就是这样,新的一年開始了,尽管非常不想干正事,没办法,必须干起来.由于后边的路还非常长,距离六十岁还非常远. 刚上班也没 ...
- MySQL InnoDB Update和Crash Recovery流程
MySQL InnoDB Update和Crash Recovery流程 概要信息 首先介绍了Redo,Undo,Log Sequence Number (LSN),Checkpoint,Rollba ...
随机推荐
- IE下空链接失效原因及解决方法
我们把a链接的display设置为block,但如果对该标签设置为position:absolute后,会发现在ie6.ie7下有时点击无效,ie8下有效(ie8标准),使用zoom:1方式也无法解决 ...
- IE6中的常见BUG与相应的解决办法
开发前端的同学一定都知道,IE6是兼容BUG最多的浏览器,它不支持PNG alpha通道暂且不论.其文档的解析理解规范也引起了诸多恼人的BUG,有时甚至让人感到绝望.本文主要讲解一些比较容易遇到的IE ...
- TatukGIS - GisDefs - ChangeDir 函数
函数名称 ChangeDir 所在单元 GisDefs 函数原型 function ChangeDir(const _path: String): String; 函数说明 如果 _path ...
- 清北第一套题(zhx)
死亡 [问题描述] 现在有个位置可以打sif,有个人在排队等着打sif.现在告诉你前个人每个人需要多长的时间打sif,问你第个人什么时候才能打sif.(前个人必须按照顺序来) [输入格式] 第一行两个 ...
- Ext.js form 表单提交问题
var form = new Ext.form.FormPanel({ labelAlign : 'right', border : false, bodyStyle : 'background-co ...
- 优秀的开发者 vs. 差的开发者
优秀的开发者是一个艺术家,一个享受创作过程的工匠.差的开发者只将自己当作负责产生代码的码农. 优秀的开发者了解客户的问题.差的开发者只了解手头的技术问题.优秀的开发者会不断努力去理解"为什么 ...
- 根据div 标签 查看数组@class=modulwrap 下面的/table/tbody/tr/td
<div class="modulwrap"> <div class="request_title"> <span class=& ...
- Git skills in reseting files
How to uncommit files that were committed long time a ago?Note: Since all changes in the current wor ...
- Python import / pyd / dll
使用Python import 模块时, 先会在模块的搜索path里依次搜索(前面会覆盖之后出现的同名模块),次序为: 1. 程序的主目录(交互模式下当前的工作目录或 脚本文件所在的目录) 2. 环境 ...
- 在Kafka中修改Topic的preferred replica
参考site:https://cwiki.apache.org/confluence/display/KAFKA/Replication+tools 目前我们的topic test-add-repl ...