mysql引用的数据结构,MySQL源码分析4:InnoDB主要数据结构及调用流程转

bc3f9276acf88283a0569b9b9ef9ee92.png

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

阅读更多

原始地址:http://software.intel.com/zh-cn/blogs/2010/09/01/mysql4innodb/

1.主要数据结构(buf0buf.h)?

(1)Buf_pool

8b7db09d7a1841ab42fb2481b2098d63.png

Buf_pool是整个缓冲区系统的核心数据结构,数据库中的所有操作都将反映在此缓冲区层中。我们可以在配置文件(InnoDB_buffer_pool_size)中指定缓冲池的大小。

缓冲池还包含多层数据结构:为了实现buffer_pool的在线大小调整,引入了块数据结构;

34669e23545444219777dce0b262262a.png

块数据结构是一种更特定的内存缓存,主要包含控制内存块的块结构;

46e8b064c3e2f6971acc64ea3c7c7f6f.png页面结构必须放在结构的第一位置,以便将来使用指针时可以轻松在页面和块之间进行转换。

例如:(buf_page_t *)buf_block_t * p

您可以获得类型为buf_page的指针

页面

d93916641d2a77b9130469536b5db85f.png

页面结构主要用于存储硬盘上的文件,仅通过空间和偏移量对应于硬盘上的数据库文件; io_fix指示页面的类型(读或写);压缩存储压缩页面;

Buf_pool原理图

3a262b3cf0cdbc4c558abbc506e0d00c.png

Io_threads

在InnoDB中,使用默认配置参数时,有一个总共10个线程,包括:4个读取线程,4个写入线程,负责异步读写操作,1个日志写入线程,负责将操作记录到日志文件中,一个srv_master线程,负责将数据定期写入磁盘和其他工作。

初始化InnoDB插件时,它将调用innobase_start_or_create_for_mysql。此功能将完成InnoDB存储引擎的初始化。创建io线程的部分在函数中

os_thread_create(io_handler_thread,n + i,thread_ids + i)

其中io_handler_thread是回调函数,主要是为每个任务分配任务后台线程

for(i = 0 ;; i ++){

fil_aio_wait(段);

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和同步aio

mysql诞生时,Linux上没有AIO机制,因此InnoDB本身实现了一组异步io框架。

关于Linux aio的引入,AIO首先以2.5进入Linux内核,现在已成为2.6生产内核的标准功能。 http://www.ibm.com/developerworks/linux/library/l-async/

Innobase最近在innodb插件中实现了真正的AIO机制。 http://blogs.innodb.com/wp/2010/04/innodb-performance-aio-linux/

数组

os_aio_read_array//异步读取

os_aio_write_array//异步写入

os_aio_ibuf_array//插入缓冲区

os_aio_log_array//日志数组在InnoDB中引入了异步同步,目标是在代码级别与aio的格式保持一致。

c4c8fc7a809087b233139b30cec76e69.png

为了实现InnoDB异步IO引入的数组,系统中有五种类型的数组:发生IO请求时,异步机制将插入请求

放入其中一个插槽(插槽),然后等待信号执行请求; IO已完成,从插槽中删除。 ,该段用作数组的标识符,并且数组的类型可以为o根据细分值获得。例如,在默认的阵列数量(4次读取,4次写入)下,数字3表示读取阵列

c4eb18c259d444f3b5a4e4712906ab21.png

插槽

c40d39de8dc1007243c12ce2cd5d18a0.png

用于存储异步读写请求的插槽。

2.调用过程

c3e4f5875b053e855b82f0df12078962.png

在InnoDB中,为了提高响应速度,有时需要立即返回数据,在这种情况下,使用了同步读取机制。而在其他对速度要求不是很高的情况下,例如预读取,InnoDB将使用异步读取方式将数据加载到内存中。根据系统,当打开双重写入缓冲区以写入数据时,InnoDB将首先将数据写入硬盘上称为双重写入缓冲区的特定区域,然后在将来的某个时候将其写入磁盘。 ■当前加载和当前内存中的脏页数有不同的延迟。

异步读写时等待请求:

36e2f2903921b41906e62d9f6815e70f.png

读取和写入缓存块时/文件完成后,发出信号:; pthread_cond_broadcast()

4849654fb396c26a791c230bf6e95ba3.png

大小:38.8 KB

1ed841fb8cac4b85d6a81de5a5081de3.png

大小:2.1 KB

879af31b268c0fec00b54b8de9974535.png

大小:13.4 KB

51e6bf1c633f71a49a48d21e40509a52.png

大小:10.3 KB

fd663d14e5ef9c1671e3f0d3303abed1.png

大小:63.1 KB

5773bbfd7c95b970be21a858fa148651.png

大小:3.6 KB

da8933eddc2244983a2d487178f5b388.png

大小:29.7 KB

9fb60a1dd3a5b9d8dee32ff075767945.png

大小:5.5 KB

b074a192dcab59dcac490b5eb6d9bd44.png

大小:51.1 KB

8ed1978860537367ec49dfc90d7953ea.png

大小:17.1 KB

查看图片附件

分享给:

89c51d035306904f1569c2c20f20a6d3.png

321b5b5ee34471d8cb848ad8d38d6700.png

MySQL源代码分析(5):Innodb缓存系统(传输)

|

MySQL源代码分析(三):详细的配置文件(传输)

2012-02-03 18:29

浏览1936年

评论(0)

类别:数据库

查看更多

评论

发表评论

8f2ca2d05b76e392c84917846ec15726.png您尚未登录,请登录并发表评论

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值