Archives

帖子来自 Yuan Zhou (Intel) RSS

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

作者: Yuan Zhou (Intel) (7 篇文章) 日期: 九月 1, 2010 在 11:52 上午
评论 (2)

Innodb缓存系统 buffer操作 根据tbl_test文件的space id和offset检查buffer pool中是否已经有缓存,若有则直接读取该page信息,并返回结果; 若没有缓存则会先分配一个空白的page,然后读取磁盘上的数据加载进内存,并将结果返回。 当Sql级别命令执行到Innodb的buffer层时就对应到在buf_pool上的对buffer block的读写等操作。 例如客户端输入以下查询语句: select * from tbl_test; 层层解析执行至缓存系统中将产生如下动作: Innodb buffer pool 系统简介  buf_pool->free, ...

继续 ›

分类: Blog Challenge, 博客征文专栏, 并行计算, 开放源代码, 英特尔® 软件网络 2.0
标签:

MySQL源码分析(4):InnoDB主要数据结构及调用流程

作者: Yuan Zhou (Intel) (7 篇文章) 日期: 九月 1, 2010 在 11:51 上午
评论 (0)

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, ...

继续 ›

分类: Blog Challenge, 博客征文专栏, 并行计算, 开放源代码, 英特尔® 软件网络 2.0
标签:

MySQL源码分析(3):配置文件详解

作者: Yuan Zhou (Intel) (7 篇文章) 日期: 九月 1, 2010 在 11:51 上午
评论 (3)

配置文件详解 关于配置文件存放位置和优先级 在一次部署中,我们发现MySQL没有按照配置文件中的innodb_data_path选项创建文件,查找后发现这台机器上有多个配置文件:/etc/my.cnf和/etc/mysql/my.cnf,而MySQL会优先读取/etc/mysql/my.cnf。当出现多个配置文件时,其优先级是如何确定的?源码面前,了无秘密。 用kDbg跟踪调试发现MySQL对系统中各处配置文件的优先级处理如下: mysys/default.c 406行: int load_defaults(const char *conf_file, const char **groups, int *argc, char ...

继续 ›

分类: Blog Challenge, 博客征文专栏, 并行计算, 开放源代码, 英特尔® 软件网络 2.0
标签:

MySQL源码分析(2):Mysql中的内存分配相关

作者: Yuan Zhou (Intel) (7 篇文章) 日期: 九月 1, 2010 在 11:50 上午
评论 (0)

Mysql中的内存分配相关 涉及到内存的配置参数 这些参数可以分成两部分,分别对应MySQL中的两个层次:服务器层和存储引擎层。 MySQL服务器相关: 每个连接到MySQL服务器的线程都需要有自己的缓冲,默认为其分配256K。事务开始之后,则需要增加更多的空间。运行较小的查询可能仅给指定的线程增加少量的内存消耗,例如存储查询语句的空间等。但如果对数据表做复杂的操作比较复杂,例如排序则需要使用临时表,此时会分配大约read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size大小的内存空间。不过它们只是在需要的时候才分配,并且在那些操作做完之后就释放了。 read_buffer_size是MySql读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。 sort_buffer_size是MySql执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。如果不能,可以尝试增加sort_buffer_size变量的大小。该变量会监测sort_merge_passed, sort_range, sort_rows, sort_scan的状况。通常较小的sort_merge_passed性能越高,但是也与workload的特性有关。 read_rnd_buffer_size是MySql的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。 query_cache_size是MySql的查询缓冲大小。(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。 此外还有每个连接中会使用的一些变量会消耗少量内存。 MyISAM引擎相关 key_buffer_size存储了所有index的缓存,一般我们设为16M,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用'key_read%'获得用来显示状态数据)。key_buffer_size只对MyISAM表起作用。即使不使用MyISAM存储引擎,但是内部的临时磁盘表是MyISAM表,故也要使用该值。 InnoDB引擎相关 innodb_buffer_pool_size对于InnoDB表来说,作用就相当于key_buffer_size对于MyISAM表的作用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,手册上推荐把该值设置成物理内存的80%。 innodb_additional_mem_pool_size指定InnoDB用来存储数据字典和其他内部数据结构的内存池大小。缺省值是1M。通常不用太大,只要够用就行,应该与表结构的复杂度有关系。如果不够用,MySQL会在错误日志中写入一条警告信息。 innodb_log_buffer_size指定InnoDB用来存储日志数据的缓存大小,如果您的表操作中包含大量并发事务(或大规模事务),并且在事务提交前要求记录日志文件,请尽量调高此项值,以提高日志效率。  Key_buffer_size  Table_open_cache  Sort_buffer_size  Read_buffer_size  Net_buffer_length  Read_rnd_buffer_size  Innodb_buffer_pool_size  Innodb_additional_mem_pool_size  Innodb_log_buffer_size  Query_cache_size Mysql中最小内存占用公式  key buffer  innodb buffer pool  innodb ...

继续 ›

分类: Blog Challenge, 博客征文专栏, 并行计算, 开放源代码, 英特尔® 软件网络 2.0
标签:

MySQL源码分析(1):主要模块及数据流

作者: Yuan Zhou (Intel) (7 篇文章) 日期: 九月 1, 2010 在 11:49 上午
评论 (2)

主要模块及数据流 经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改。本文将对MySQL的整体架构及重要目录进行讲述。 源码结构(MySQL-5.5.0-m2) BUILD: 内含在各个平台、各种编译器下进行编译的脚本。如compile-pentium-debug表示在pentium架构上进行编译的脚本。 Client: 客户端工具,如mysql, mysqladmin之类。 Cmd-line-utils: readline, libedit工具。 Config: 给aclocal使用的配置文件。 Dbug: 提供一些调试用的宏定义。 Extra: 提供innochecksum,resolveip等额外的小工具。 Include: 包含的头文件 Libmysql: ...

继续 ›

分类: Blog Challenge, 博客征文专栏, 并行计算, 开放源代码, 英特尔® 软件网络 2.0
标签:

MySQL源码分析(6):Innodb文件格式及压缩配置

作者: Yuan Zhou (Intel) (7 篇文章) 日期: 八月 28, 2010 在 6:23 下午
评论 (0)

Innodb文件格式及压缩配置 Innodb文件格式代表了数据库文件在磁盘上的组织形式。 Tablespace包含了很多文件或raw disk partition。 当innodb_file_per_table = on时,每个数据库会使用单独的ibd文件存储数据,否则将和系统表等数据一起放在innodb_data_file_path指定的文件中。 在系统表空间中,innodb会维护一些系统信息:  Internal data dictionary  Undo  Insert buffer  Double write buffer  Mysql ...

继续 ›

分类: Blog Challenge, 博客征文专栏, 并行计算, 开放源代码, 英特尔® 软件网络 2.0
标签:

MySQL源码分析(0):编译安装及调试

作者: Yuan Zhou (Intel) (7 篇文章) 日期: 八月 20, 2010 在 12:13 下午
评论 (0)

编译安装 为了实现MySQL的更高级别的性能调优,我们通常需要理解其内部实现机制,并对其进行优化调试。在下面的系列中,我们会分别介绍MySQL的部分内部实现机制。 首先我们介绍如何从源代码部署一台MySQL服务器。 下载MySQL Community Server源码 http://dev.mysql.com/downloads/ 本文中演示使用的是mysql-5.5.0-m2版本。 安装环境: [root@localhost ~]# uname -a Linux localhost.localdomain 2.6.18-164.el5 #1 ...

继续 ›

分类: Blog Challenge, 并行计算, 开放源代码, 英特尔® 软件网络 2.0
标签:,