Mysql内存管理分析

  • 格式:docx
  • 大小:1012.48 KB
  • 文档页数:12

下载文档原格式

  / 19
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Mysql内存管理一、M ysql架构

Mysql数据库的体系架构如上图所示,包括以下几部分:

1、连接池组件

2、管理服务和工具组件

3、SQL接口组件

4、查询分析器组件

5、优化器组件

6、缓冲组件

7、插件式存储引擎

8、物理文件

二、M ysql内存管理

2.1 Mysql内存分类

2.1.1 线程独享内存

a)线程栈信息(thread_stack)

存放每一个线程自身的标志信息,如线程id、线程运行时的基本信息等。可以使用thread_stack来为每个线程栈设置分配多大的内存。

b)排序使用内存(sort_buffer_size)

Mysq在排序内存中对客户端的排序请求进行操作。如果排序区的缓存大小无法满足排序实际所需要的内存需求,mysql会讲数据写入磁盘文件来完成排序,所以对经常进行排序的查询请求,sort_buffer_size参数设置对性能的影响非常大。

c)Join操作使用内存(join_buffer_size)

多表进行join操作时使用的内存块,为了减少参与join的”被驱动”表的读取次数来提高join操作的性能,需要使用join buffer来协助完成join操作。当join buffer太小时,mysql不会将buffer写入磁盘文件,而是将joinbuffer中的结果集与需要join的表进行join操作,然后清空join buffer,继续将剩余的结果集写入到buffer中,如此往复。所以join_buffer_size太小,会增加io的访问。该缓存join类型为全表扫描(all)、全索引扫描(index)、索引区间扫描(range)时有效,在其他情况下不使用该缓存。

不使用join buffer时join的操作流程如下:

使用join buffer是join的操作流程如下:

d)顺序读取数据缓冲区(read_buffer_size)

这部分内存主要用户顺序读取数据操作,例如无法使用索引时进行的全表扫描、全索引扫描等。Mysql按照数据的存储数据一次读取数据块,将数据块暂存在read buffer 中,当buffer空间被写满或者全部数据读取接收后,将buffer的数据返回给上层调用者,来提高效率。

e)随机读取数据缓冲区(read_rnd_buffer_size)

和顺序读取相对应,在mysq随机读取数据的时候,会利用这个缓冲区暂存读取的数据,例如根据索引信息读取数据表数据等。

f)连接信息及返回客户端前结果集暂存使用内存(net_buffer_size)

保存客户端连接线程的连接信息和返回客户端的结果集。Mysql在产生了可以返回的结果之前,会先暂存在net buffer缓冲区中,等满足一定大小的时候才开始向客户端发送,以提高网络阐述效率。net_buffer_size设置的是该缓存区的初始化大小,根据实际需要mysql会自行申请更多的内存,最大不超过max_allowed_pacet参数所设置的大小。g)批量插入暂存使用内存(bulk_insert_buffer_size)

使用insert语句进行批量插入的时候,mysql会将提交的数据放入到insert buffer 中,当buffer空间被写满或者提交完所有的数据后,mysql会一次性将缓存空间的数据写入数据库并清空缓存。使用load data infile操作将文本导入数据库时,也会使用insert buffer缓冲区,该缓存只有myisam存储引擎使用。

h)临时表使用内存(tmp_table_size)

一些特殊的操作,例如order by,group by等,需要使用到临时表。若临时表需要的空间小于tmp_table_size的设置值,mysql会在内存里创建临时表,否则会在myisam存储引擎上创建表放在磁盘中。Mysql5.1.2开始支持该参数设置,之前一直使用max_heap_table_size。

2.1.2 线程共享内存

a)查询缓存(Query Cache)

缓存里保存特定query的结果集信息,并且提供给所有的客户端共享。通过对query 语句进行特定的hash计算,并与结果集对应存放到query cache中,来提高完全相同的query语句的响应速度。当任何一张表的数据发生任何变化之后,该表对应的query cache 全部会失效,所以query cache对变动比较频繁的表并不是非常适用,而对于变更较少的表,例如配置表、静态资源表等,会极大提高查询效率。

b)连接线程缓存(Thread Cache)

线程缓存保存部分空闲的连接线程,当有新连接进来时,首先从缓存池中获取空闲线程,提高创建线程连接的效率。

c)表缓存(Table Cache)

表缓存保存表的文件句柄信息,在MYSQL5.13前使用table_cache参数设置,MYSQL5.13开始改为table_open_cache设置其大小。在客户端提交query后,mysql需要取得query所涉及到的表文件句柄时,首先从table_cache中获取一个空闲的表文件句柄,若没有再创建。在使用完表文件句柄后,会将空闲的句柄放入到table_cache中。

d)表定义信息缓存(Tale definition Cache)

表定义信息缓存是从MYSQL5.1.3版本后引入的新缓冲区,存放表定义信息。当mysql中使用了较多的表的时候,词缓冲会提高对表定义信息的访问效率。

e)二进制日志缓冲区

缓存由于各种数据变更操作所产生的Binary Log信息。为了提高性能,mysql先将二进制日志写入Binlog Buffer中,满足特定的条件后,再一次写入到Log File中。可以通过binlog_cache_size来设置使用的内存大小,同时通过max_binlog_cache_size限制其最大大小。

f)InnoDB日志缓冲区(InnoDB Log Buffer)

InnoDB存储引擎的事务日志缓冲区,类似于Binlog Buffer。当写入缓冲区的日志满足innodb_flush_log_trx_commit条件或者缓冲区写满时,会将日志同步到文件中。可以通过innodb_log_buffer_size设置使用的最大内存空间。注意,innodb_flush_trx_commit 对innodb的日志写入性能非常影响,具体值和含义如下:

0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作。

1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步。

2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。

g)InnoDB数据和索引缓冲(InnoDB Buffer Pool)

InnoDB Buffer Pool 不仅仅缓存索引数据,还会缓存表的数据,而且完全按照数据文件中的数据快结构信息来缓存,对InnoDB存储引擎的性能影响非常大。

h)InnoDB字典信息缓存

InnoDB 字典信息缓存主要用来存放InnoDB 存储引擎的字典信息以及一些internal 的共享数据结构信息。