原文地址:http://software.intel.com/zh-cn/blogs/2010/09/01/mysql4innodb/
1.主要数据结构(buf0buf.h)
(1)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
存放异步读写请求的插槽。
2.调用流程
在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()
- 大小: 38.8 KB
- 大小: 2.1 KB
- 大小: 13.4 KB
- 大小: 10.3 KB
- 大小: 63.1 KB
- 大小: 3.6 KB
- 大小: 29.7 KB
- 大小: 5.5 KB
- 大小: 51.1 KB
- 大小: 17.1 KB
分享到:
相关推荐
### MySQL InnoDB 查询优化实现分析 #### 一、目的与背景 本文旨在深入探讨 MySQL + InnoDB 存储引擎在实现查询优化时所采取的方法及其内部机制。通过具体实例和详细的技术解析,揭示 InnoDB 如何高效处理各种查询...
《MySQL技术大全:开发、优化与运维实战实例源代码》是一本深入探讨MySQL数据库系统的技术书籍,涵盖了开发、性能优化和运维等多个方面的实践内容。这本书的源代码包含了丰富的实例,帮助读者更好地理解和应用书中...
源码分析对于开发者来说是一个宝贵的学习资源,可以帮助深入理解 MySQL 的内部工作原理。通过查看源码,可以了解 MySQL 如何处理 SQL 语句、管理事务、优化查询、存储和检索数据等。此外,源码分析还能帮助开发者...
MySQL源码主要由C++编写,它分为多个模块,包括连接管理、SQL解析、查询优化、存储引擎等。在`mysql-5.5.19`中,我们可以深入研究以下关键组件: 1. **连接管理**:MySQL服务器通过`libmysqlclient`库处理客户端...
- 使用`cmake`对MySQL源码进行配置,设置了一系列参数,例如安装路径、数据目录、字符集、存储引擎等。 - 配置完成后会进入一个名为`source_download`的目录,但这里并没有继续操作,而是直接返回上一级目录重新...
1. **MySQL源码结构**:MySQL源码包含多个组件,如InnoDB存储引擎、SQL解析器、查询优化器等。理解这些组件的职责和交互对于源码分析至关重要。 2. **C++编程基础**:MySQL主要用C++编写,因此熟悉C++语言是深入...
MySQL存储过程是一种预编译好的SQL脚本,它可以接受输入参数、返回单个或多个结果,并且能够包含复杂的流程控制逻辑。存储过程可以被视作数据库的一个函数,可以在不同的应用程序中重复调用,从而简化开发工作并提高...
添加和删除InnoDB数据和日志文件 15.2.8. InnoDB数据库的备份和恢复 15.2.9. 将InnoDB数据库移到另一台机器上 15.2.10. InnoDB事务模型和锁定 15.2.11. InnoDB性能调节提示 15.2.12. 多版本的实施 15.2.13. 表和...
1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 ...
源码分析有助于理解MySQL的内部工作原理,如查询优化、事务处理和并发控制等。 "工具"标签则涵盖了MySQL提供的各种实用工具,例如mysql命令行客户端、mysqldump用于数据备份和恢复、mysqladmin用于服务器管理、...
1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 ...
通过深入研究这些源代码,开发者可以理解MySQL的内部运作,从而更好地优化SQL查询、设计高效的数据结构、调整系统参数以及解决性能问题。这不仅有助于提升MySQL数据库的运行效率,也为其他数据库系统的开发提供了...
添加和删除InnoDB数据和日志文件 15.2.8. InnoDB数据库的备份和恢复 15.2.9. 将InnoDB数据库移到另一台机器上 15.2.10. InnoDB事务模型和锁定 15.2.11. InnoDB性能调节提示 15.2.12. 多版本的实施 15.2.13. 表和...
添加和删除InnoDB数据和日志文件 15.2.8. InnoDB数据库的备份和恢复 15.2.9. 将InnoDB数据库移到另一台机器上 15.2.10. InnoDB事务模型和锁定 15.2.11. InnoDB性能调节提示 15.2.12. 多版本的实施 15.2.13. 表和...
1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可...
MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 ...
1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可...
添加和删除InnoDB数据和日志文件 15.2.8. InnoDB数据库的备份和恢复 15.2.9. 将InnoDB数据库移到另一台机器上 15.2.10. InnoDB事务模型和锁定 15.2.11. InnoDB性能调节提示 15.2.12. 多版本的实施 15.2.13. 表和...
【源码分析】 "renshi.sql"可能是数据库初始化脚本,用于创建数据库表结构和填充初始数据。而"hrmapp"可能是一个项目文件夹,包含了SSM项目的源代码,包括配置文件、Java类、HTML模板、CSS和JS文件等。通过Eclipse...