网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > 性能调优 > MySQL数据库优化(十一)-性能调优  

MySQL数据库优化(十一)-性能调优

2008-06-19  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

 

  2、 MySQL 如何使用内存  网管网www.bitscn.com

  以下展示了 mysqld 服务器使用内存的几种方法。可适用的是,和使用内存相关的系统变量名已经给出了:

网管有家www.bitscn.net

  •   索引缓冲(key_buffer_size 变量)在所有的线程间是共享的;服务器所需的其他缓冲已经分配好了。
  •   每个连接使用的一些线程特有的空间:
  •   一个堆栈(默认是64KB,thread_stack 变量)。
  •   一个连接缓冲(net_buffer_length变量)。
  •   一个结果缓冲(net_buffer_length 变量)。

  连接缓冲和结果缓冲可根据需要动态扩大到max_allowed_packet。一个查询正在执行时,当前查询语句的一份拷贝也需要为之分配内存。

网管网www.bitscn.com

  •   所有的线程共享一样的基本内存。
  •   只有压缩后的 ISAM 和 MyISAM表才是内存映射的。这是因为32位的内存只有4GB的内存空间,对大部分大表都不够。当64位寻址的操作系统更普遍时,我们会普遍支持内存映射的。
  •   每个需要顺序扫描数据表的请求都需要分配一个读缓冲(read_buffer_size 变量)。
  •   如果以\"随机\"顺序读取记录(例如,排序之后),一个随机-读缓冲就必须分配以避免磁盘搜索(read_rnd_buffer_size

  变量)。

网管联盟bitsCN@com

  •   所有的表连接都在一个步骤中完成,甚至大部分连接可以不使用临时表就能完成。大部分临时表都是基于内存(HEAP表)的。记录长度很长(所有的字段长度之和)或者包含有 BLOB 字段的临时表都会存储在磁盘中。在MySQL

  3.23.2之前有一个问题是,当一个内部的内存表大小超过 tmp_table_size 后,就会产生一个 The table tbl_name is full 错误。在MySQL 3.23.2后,这会自动处理,在必须的时候把内存表转换成基于磁盘存储的MyISAM 表。想要在旧版本的MySQL也能正常运行,可以给 mysqld 设置 tmp_table_size选项以增加临时表大小,或者在客户端程序中设置 SQL_BIG_TABLES 选项。在MySQL3.20中,临时表的大小最多为record_buffer*16;如果你使用这个版本,就必须加大record_buffer的值。可以在使用--big-tables 选项启动 mysqld来允许将临时表保存在磁盘中。不过这会影响很多查询编译。

网管u家u.bitsCN.com

  •   大部分需要做排序的请求都会分配排序缓冲,且视结果集大小分配0到2个临时文件。
  •   几乎所有的解析和计算在本地内存存储中已经做完了。无需为小的条目耗费内存,因此通常能避免比较慢的内存分配以及释放。内存只分配给不可预料的大字符串;这由malloc() 和 free() 来完成。
  •   每个打开着的 MyISAM 和 ISAM表,索引文件只打开一次,而数据文件则是每次为同时运行的线程打开一次。在每个当前的线程中,表结构,每个字段的结构,需要分配大小3 * N 的缓冲(N 是记录的最大长度,不计算 BLOB 字段)。BLOB字段需要比 BLOB 数据长度多出来5到8字节。MyISAM 和 ISAM存储引擎维护一个额外的缓冲字段供内部使用。
  •   对于每个有 BLOB 字段的表,专门为其扩展一个动态缓冲来读取大BLOB 数据。读表的时候,就会分配一个以最大长的 BLOB数据长度的缓冲。
  •   所有的使用中的表句柄都缓存起来并且被当作FIFO来管理。默认地,这个缓存有64个表目。如果有一个表同时被两个运行着的线程使用了,那么在缓存中包含了该表的2个表目。
  •   FLUSH TABLES 语句或mysqladmin flush-tables命令会关闭所有非使用中的表,并且也会在线程结束后关闭那些使用中的表。这对释放使用中的内存很有效。

  ps 网管联盟bitsCN_com

  和其他系统程序都可以报告 mysqld 使用了大量内存。这个可能是因为在不同内存地址上的线程堆栈导致。例如,Solaris下的ps 会把堆栈中未使用的内存也认为是已使用了。可以通过 swap -s命令来检查可用的交换内存。我们已经用好几个内存泄漏监测器来测试了mysqld(包括商业的和开源的),应该不会存在内存泄漏。

网管u家u.bitsCN.com

网管朋友网www_bitscn_net

TAGs   性能   十一   优化   数据库   使用   编译   内存   MySQL   连接   选项      
 上一篇:MySQL数据库优化(十)-性能调优   下一篇:SQL Server 2008与Oracle 11g 相比较-性能调优
MySQL数据库优化(十一)-性能调优 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: