设为首页 加入收藏

TOP

mysql内存使用分析(二)(一)
2014-11-24 03:21:12 来源: 作者: 【 】 浏览:2
Tags:mysql 内存 使用 分析
author:skate
time:2012/02/16

mysql内存使用分析


2.全局共享内存

全局共享内则主要是MySQL Instance(mysqld进程)以及底层存储引擎用来暂存各种全局运算及可共享的暂存信息,如存储查询缓存的Query Cache,缓存连接线程的Thread Cache,缓存表文件句柄信息的Table Cache,缓存二进制日志的BinLog Buffer, 缓存MyISAM 存储引擎索引键的Key Buffer以及存储InnoDB 数据和索引的InnoDB Buffer Pool 等等。下面针对MySQL 主要的共享内存进行一个简单的分析。

查询缓存(Query Cache):
查询缓存是MySQL 比较独特的一个缓存区域,用来缓存特定Query 的结果集(Result Set)信息,且共享给所有客户端。通过对Query 语句进行特定的Hash 计算之后与结果集对应存放在Query Cache 中,以提高完全相同的Query 语句的相应速度。当我们打开MySQL 的Query Cache 之后,MySQL 接收到每一个SELECT 类型的Query 之后都会首先通过固定的Hash 算法得到该Query 的Hash 值,然后到Query Cache 中查找是否有对应的Query Cache。如果有,则直接将Cache 的结果集返回给客户端。如果没有,再进行后续操作,得到对应的结果集之后将该结果集缓存到Query Cache 中,再返回给客户端。当任何一个表的数据发生任何变化之后,与该表相关的所有Query Cache 全部会失效,所以Query Cache 对变更比较频繁的表并不是非常适用,但对那些变更较少的表是非常合适的,可以极大程度的提高查询效率,如那些静态资源表,配置表等等。为了尽可能高效的利用Query Cache,MySQL 针对Query Cache 设计了多个query_cache_type 值和两个Query Hint:SQL_CACHE 和SQL_NO_CACHE。当query_cache_type 设置为0(或者OFF)的时候不使用Query Cache,当设置为1(或者ON)的时候,当且仅当Query 中使用了SQL_NO_CACHE 的时候MySQL 会忽略Query Cache,当query_cache_type 设置为2(或者DEMAND)的时候,当且仅当Query 中使用了SQL_CACHE 提示之后,MySQL 才会针对该Query 使用Query Cache。可以通过query_cache_size 来设置可以使用的最大内存空间。

连接线程缓存(Thread Cache):
连接线程是MySQL 为了提高创建连接线程的效率,将部分空闲的连接线程保持在一个缓存区以备新进连接请求的时候使用,这尤其对那些使用短连接的应用程序来说可以极大的提高创建连接的效率。当我们通过thread_cache_size 设置了连接线程缓存池可以缓存的连接线程的大小之后,可以通过(Connections - Threads_created) / Connections * 100% 计算出连接线程缓存的命中率。注意,这里设置的是可以缓存的连接线程的数目,而不是内存空间的大小。

表缓存(Table Cache):
表缓存区主要用来缓存表文件的文件句柄信息,在MySQL5.1.3之前的版本通过table_cache 参数设置,但从MySQL5.1.3开始改为table_open_cache 来设置其大小。当我们的客户端程序提交Query 给MySQL 的时候,MySQL 需要对Query 所涉及到的每一个表都取得一个表文件句柄信息,如果没有Table Cache,那么MySQL 就不得不频繁的进行打开关闭文件操作,无疑会对系统性能产生一定的影响,Table Cache 正是为了解决这一问题而产生的。在有了Table Cache 之后,MySQL 每次需要获取某个表文件的句柄信息的时候,首先会到Table Cache 中查找是否存在空闲状态的表文件句柄。如果有,则取出直接使用,没有的话就只能进行打开文件操作获得文件句柄信息。在使用完之后,MySQL 会将该文件句柄信息再放回Table Cache 池中,以供其他线程使用。注意,这里设置的是可以缓存的表文件句柄信息的数目,而不是内存空间的大小。

表定义信息缓存(Table definition Cache):
表定义信息缓存是从MySQL5.1.3 版本才开始引入的一个新的缓存区,用来存放表定义信息。当我们的MySQL 中使用了较多的表的时候,此缓存无疑会提高对表定义信息的访问效率。MySQL 提供了table_definition_cache 参数给我们设置可以缓存的表的数量。在MySQL5.1.25 之前的版本中,默认值为128,从MySQL5.1.25 版本开始,则将默认值调整为256 了,最大设置值为524288。注意,这里设置的是可以缓存的表定义信息的数目,而不是内存空间的大小。

二进制日志缓冲区(Binlog Buffer):
二进制日志缓冲区主要用来缓存由于各种数据变更操做所产生的Binary Log 信息。为了提高系统的性能,MySQL 并不是每次都是将二进制日志直接写入Log File,而是先将信息写入Binlog Buffer 中,当满足某些特定的条件(如sync_binlog参数设置)之后再一次写入Log File 中。我们可以通过binlog_cache_size 来设置其可以使用的内存大小,同时通过max_binlog_cache_size 限制其最大大小(当单个事务过大的时候MySQL 会申请更多的内存)。当所需内存大于max_binlog_cache_size 参数设置的时候,MySQL 会报错:“Multi-statement transaction required more than ‘max_binlog_cache_size’bytes of storage”。

MyISAM索引缓存(Key Buffer):
MyISAM 索引缓存将MyISAM 表的索引信息缓存在内存中,以提高其访问性能。这个缓存可以说是影响MyISAM 存储引擎性能的最重要因素之一了,通过key_buffere_size 设置可以使用的最大内存空间。

InnoDB 日志缓冲区(InnoDB Log Buffer):
这是InnoDB 存储引擎的事务日志所使用的缓冲区。类似于Binlog Buffer,InnoDB 在写事务日志的时候,为了提高性能,也是先将信息写入Innofb Log Buffer 中,当满足innodb_flush_log_trx_commit 参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件(或者同步到磁盘)中。可以通过innodb_log_buffer_size 参数设置其可以使用的最大内存空间。
注:innodb_flush_log_trx_commit 参数对InnoDB Log 的写入性能有非常关键的影响。该参数可以设置为0,1,2,解释如下:


0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作;
1:在每
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mysql内存使用分析(一) 下一篇mySQL内存及虚拟内存优化设置

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·MySQL 安装及连接-腾 (2025-12-25 06:20:28)
·MySQL的下载、安装、 (2025-12-25 06:20:26)
·MySQL 中文网:探索 (2025-12-25 06:20:23)
·Shell脚本:Linux Sh (2025-12-25 05:50:11)
·VMware虚拟机安装Lin (2025-12-25 05:50:08)