mysql内存使用分析(一)
来源:未知 责任编辑:责任编辑 发表时间:2014-05-26 11:02 点击:次
author:skate
time:2012/02/16
mysql内存使用分析
从内存的使用方式来说,MySQL数据库的内存使用主要分为以下两类
1.线程独享内存
2.全局共享内存
1.线程独享内存
在MySQL 中,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,
如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可
以通过相关参数来控制内存的使用量。
线程栈信息使用内存(thread_stack):
主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,
我们可以通过thread_stack 参数来设置为每一个线程栈分配多大的内存。
排序使用内存(sort_buffer_size):
MySQL 用此内存区域进行排序操作(filesort),完成客户端的排序请求。当我们
设置的排序区缓存大小无法满足排序实际所需内存的时候,MySQL 会将数据写入磁
盘文件来完成排序。由于磁盘和内存的读写性能完全不在一个数量级,所以
sort_buffer_size参数对排序操作的性能影响绝对不可小视。排序操作的实现原理
请参考:MySQL Order By 的实现分析。
Join操作使用内存(join_buffer_size):
应用程序经常会出现一些两表(或多表)Join的操作需求,MySQL在完成某些Join
需求的时候(all/index join),为了减少参与Join的“被驱动表”的读取次数以提
高性能,需要使用到Join Buffer来协助完成Join操作(具体Join实现算法请参考:
MySQL中的Join 基本实现原理)。当Join Buffer太小,MySQL 不会将该Buffer存
入磁盘文件,而是先将Join Buffer中的结果集与需要Join的表进行Join操作,然后
清空Join Buffer 中的数据,继续将剩余的结果集写入此Buffer中,如此往复。
这势必会造成被驱动表需要被多次读取,成倍增加IO 访问,降低效率。
顺序读取数据缓冲区使用内存(read_buffer_size):
这部分内存主要用于当需要顺序读取数据的时候,如无法使用索引的情况下的全表
扫描,全索引扫描等。在这种时候,MySQL按照数据的存储顺序依次读取数据块,
每次读取的数据快首先会暂存在read_buffer_size中,当buffer空间被写满或者全部
数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。
随机读取数据缓冲区使用内存(read_rnd_buffer_size):
和顺序读取相反,当MySQL进行非顺序读取(随机读取)数据块的时候,会利用这个缓冲
区暂存读取的数据。如根据索引信息读取表数据,根据排序后的结果集与表进行Join等等。
总的来说,就是当数据块的读取需要满足一定的顺序的情况下,MySQL就需要产生随机读
取,进而使用到read_rnd_buffer_size 参数所设置的内存缓冲区。
连接信息及返回客户端前结果集暂存使用内存(net_buffer_size):
这部分用来存放客户端连接线程的连接信息和返回客户端的结果集。当MySQL 开始产生
可以返回的结果集,会在通过网络返回给客户端请求线程之前,会先暂存在通过
net_buffer_size 所设置的缓冲区中,等满足一定大小的时候才开始向客户端发送,以提高网
络传输效率。不过,net_buffer_size 参数所设置的仅仅只是该缓存区的初始化大小,MySQL
会根据实际需要自行申请更多的内存以满足需求,但最大不会超过max_allowed_packet 参数大小。
批量插入暂存使用内存(bulk_insert_buffer_size):
当我们使用如insert …values(…),(…),(…)… 的方式进行批量插入的时候,MySQL 会先将
time:2012/02/16
mysql内存使用分析
从内存的使用方式来说,MySQL数据库的内存使用主要分为以下两类
1.线程独享内存
2.全局共享内存
1.线程独享内存
在MySQL 中,线程独享内存主要用于各客户端连接线程存储各种操作的独享数据,
如线程栈信息,分组排序操作,数据读写缓冲,结果集暂存等等,而且大多数可
以通过相关参数来控制内存的使用量。
线程栈信息使用内存(thread_stack):
主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,
我们可以通过thread_stack 参数来设置为每一个线程栈分配多大的内存。
排序使用内存(sort_buffer_size):
MySQL 用此内存区域进行排序操作(filesort),完成客户端的排序请求。当我们
设置的排序区缓存大小无法满足排序实际所需内存的时候,MySQL 会将数据写入磁
盘文件来完成排序。由于磁盘和内存的读写性能完全不在一个数量级,所以
sort_buffer_size参数对排序操作的性能影响绝对不可小视。排序操作的实现原理
请参考:MySQL Order By 的实现分析。
Join操作使用内存(join_buffer_size):
应用程序经常会出现一些两表(或多表)Join的操作需求,MySQL在完成某些Join
需求的时候(all/index join),为了减少参与Join的“被驱动表”的读取次数以提
高性能,需要使用到Join Buffer来协助完成Join操作(具体Join实现算法请参考:
MySQL中的Join 基本实现原理)。当Join Buffer太小,MySQL 不会将该Buffer存
入磁盘文件,而是先将Join Buffer中的结果集与需要Join的表进行Join操作,然后
清空Join Buffer 中的数据,继续将剩余的结果集写入此Buffer中,如此往复。
这势必会造成被驱动表需要被多次读取,成倍增加IO 访问,降低效率。
顺序读取数据缓冲区使用内存(read_buffer_size):
这部分内存主要用于当需要顺序读取数据的时候,如无法使用索引的情况下的全表
扫描,全索引扫描等。在这种时候,MySQL按照数据的存储顺序依次读取数据块,
每次读取的数据快首先会暂存在read_buffer_size中,当buffer空间被写满或者全部
数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。
随机读取数据缓冲区使用内存(read_rnd_buffer_size):
和顺序读取相反,当MySQL进行非顺序读取(随机读取)数据块的时候,会利用这个缓冲
区暂存读取的数据。如根据索引信息读取表数据,根据排序后的结果集与表进行Join等等。
总的来说,就是当数据块的读取需要满足一定的顺序的情况下,MySQL就需要产生随机读
取,进而使用到read_rnd_buffer_size 参数所设置的内存缓冲区。
连接信息及返回客户端前结果集暂存使用内存(net_buffer_size):
这部分用来存放客户端连接线程的连接信息和返回客户端的结果集。当MySQL 开始产生
可以返回的结果集,会在通过网络返回给客户端请求线程之前,会先暂存在通过
net_buffer_size 所设置的缓冲区中,等满足一定大小的时候才开始向客户端发送,以提高网
络传输效率。不过,net_buffer_size 参数所设置的仅仅只是该缓存区的初始化大小,MySQL
会根据实际需要自行申请更多的内存以满足需求,但最大不会超过max_allowed_packet 参数大小。
批量插入暂存使用内存(bulk_insert_buffer_size):
当我们使用如insert …values(…),(…),(…)… 的方式进行批量插入的时候,MySQL 会先将
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>