`
Robinson
  • 浏览: 90607 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

mysql内存管理

    博客分类:
  • DB
阅读更多

show variables;

 

 mysql的内存管理其实是比较复杂的,小结下,分为两类:
1 线程独享内存
2 全局共享内存

先说线程独享内存:
线程栈信息使用内存(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 会先将提交的数据放如一个缓存空间中,当该缓存空间被写满或者提交完所有数据之后,MySQL 才会一次性将该缓存空间中的数据写入数据库并清空缓存。此外,当我们进行 LOAD DATA INFILE 操作来将文本文件中的数据 Load 进数据库的时候,同样会使用到此缓冲区。

临时表使用内存(tmp_table_size):当我们进行一些特殊操作如需要使用临时表才能完成的 Order By,Group By 等等,MySQL 可能需要使用到临时表。当我们的临时表较小(小于 tmp_table_size 参数所设置的大小)的时候,MySQL 会将临时表创建成内存临时表,只有当 tmp_table_size 所设置的大小无法装下整个临时表的时候,MySQL 才会将该表创建成 MyISAM 存储引擎的表存放在磁盘上。不过,当另一个系统参数 max_heap_table_size 的大小还小于 tmp_table_size 的时候,MySQL 将使用 max_heap_table_size 参数所设置大小作为最大的内存临时表大小,而忽略 tmp_table_size 所设置的值。而且 tmp_table_size 参数从 MySQL 5.1.2 才开始有,之前一直使用 max_heap_table_size。


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:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;
2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。
此外,MySQL文档中还提到,这几种设置中的每秒同步一次的机制,可能并不会完全确保非常准确的每秒就一定会发生同步,还取决于进程调度的问 题。实际上,InnoDB 能否真正满足此参数所设置值代表的意义正常 Recovery 还是受到了不同 OS 下文件系统以及磁盘本身的限制,可能有些时候在并没有真正完成磁盘同步的情况下也会告诉 mysqld 已经完成了磁盘同步。

InnoDB 数据和索引缓存(InnoDB Buffer Pool):InnoDB Buffer Pool 对 InnoDB 存储引擎的作用类似于 Key Buffer Cache 对 MyISAM 存储引擎的影响,主要的不同在于 InnoDB Buffer Pool 不仅仅缓存索引数据,还会缓存表的数据,而且完全按照数据文件中的数据快结构信息来缓存,这一点和 Oracle SGA 中的 database buffer cache 非常类似。所以,InnoDB Buffer Pool 对 InnoDB 存储引擎的性能影响之大就可想而知了。可以通过 (Innodb_buffer_pool_read_requests – Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 计算得到 InnoDB Buffer Pool 的命中率。

InnoDB 字典信息缓存(InnoDB Additional Memory Pool):InnoDB 字典信息缓存主要用来存放 InnoDB 存储引擎的字典信息以及一些 internal 的共享数据结构信息。所以其大小也与系统中所使用的 InnoDB 存储引擎表的数量有较大关系。不过,如果我们通过 innodb_additional_mem_pool_size 参数所设置的内存大小不够,InnoDB 会自动申请更多的内存,并在 MySQL 的 Error Log 中记录警告信息。

分享到:
评论

相关推荐

    MySQL内存管理,内存分配器和操作系统

    MySQL内存管理的核心在于内存分配器,它负责高效地分配和回收内存块。MySQL使用多种内存分配策略,包括自定义的内存分配器如jemalloc、ptmalloc等,它们的设计目标是减少内存碎片和提高内存分配效率。内存碎片是内存...

    mysql中的内存使用.pdf

    在讨论MySQL内存管理时,我们需要理解MySQL在处理数据库操作时对内存的使用,这对于数据库性能优化至关重要。MySQL的内存管理可以根据使用的内存类型被划分为两大类:线程独享内存和全局共享内存。 首先是线程独享...

    深入比较Oracle与MySQL在内存管理上的策略与实践

    本文将深入探讨Oracle与MySQL在内存管理方面的差异,包括内存架构、自动内存管理、手动内存管理,以及如何通过代码和配置来优化内存使用。 Oracle和MySQL在内存管理上采取了不同的策略。Oracle提供了更为复杂和灵活...

    MySQL 内存分析

    在进行MySQL内存分析时,首先需要了解MySQL的内存结构和工作机制,这对于优化MySQL的性能至关重要。内存分配问题在容量规划阶段常常被提出,人们会疑惑应该为MySQL以及整个系统分配多少内存。通常互联网上有许多不...

    MySQL8.0内存相关参数总结

    MySQL8.0内存相关参数是优化数据库性能的关键因素,它们决定了数据库如何管理和使用内存资源,以提高查询效率和系统稳定性。下面将详细解释几个重要的内存参数及其作用。 1. **innodb_buffer_pool_size**: 这是...

    -MySQL内存统计的分析与实践.pptx

    内存管理对于MySQL数据库的性能有着深远影响,而有效地分析和理解内存使用情况可以帮助优化数据库性能,预防并解决内存溢出等问题。 首先,让我们来探讨一下为什么在实际操作中,内存问题往往难以搞定。主要原因是...

    MySql5.7安装到主从配置到生产环境高可用MHA部署

    以上内容总结了 MySQL 5.7 的安装、配置以及生产环境中高可用 MHA 部署的相关知识点,涵盖了 MySQL 的版本分支、版本命名规则、5.7 主要特性以及内存管理机制等方面。希望这些信息能帮助您更好地理解和使用 MySQL ...

    MySQL内存使用的查看方式详解

    MySQL内存管理是数据库高效运行的关键因素之一,它包括全局内存和线程内存两个主要部分。全局内存涉及到服务器级别的缓存和缓冲区,如InnoDB缓冲池、查询缓存、排序缓冲区等,而线程内存则与每个客户端连接关联,如...

    mysql管理工具

    MySQL管理工具是数据库管理员用来创建、管理和维护MySQL数据库的关键软件。在本文中,我们将深入探讨MySQL的一些重要管理工具,特别是提及的"SQLyog 10.2",以及它如何帮助用户更有效地进行数据库操作。 MySQL是一...

    mysql内存池.zip

    MySQL数据库系统在运行...总的来说,MySQL的内存池是通过伙伴算法实现的内存管理机制,提供了高效且低碎片的内存分配方式。提供的源代码示例可能帮助开发者理解如何在C++项目中自定义和使用内存池,以优化内存管理。

    MySQL高级第三天.md

    #### 三、MySQL内存管理及优化 MySQL服务器的内存管理对于整体性能有着至关重要的影响。合理的内存配置可以帮助系统更好地处理大量数据和并发请求。 1. **内存优化原则** - 在满足应用程序需求的同时,尽可能多地...

    学生管理系统(Mysql数据库版)

    开发者需掌握C语言的基本语法、文件操作、内存管理以及错误处理等技能,以便编写稳定可靠的代码。 4. **数据库连接与操作**:在C语言中,通常使用MySQL的C API或者第三方库如libmysqlclient来连接和操作数据库。这...

    2G内存的MYSQL数据库服务器优化

    - **MySQL数据库服务器**:特指基于MySQL关系型数据库管理系统搭建的服务器。 - **优化**:通过对MySQL配置参数的调整,以提升数据库服务器的性能。 #### 描述解析:2G内存的MySQL数据库服务器优化 描述部分重申了...

    MySQL 系统管理员指南

    MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,广泛应用于各种规模的企业、网站和应用程序中。作为MySQL系统管理员,理解并掌握其核心概念和技术是至关重要的。以下是对标题"MySQL系统管理员指南"和描述中...

    mysql的管理工具

    9. Zabbix:虽然主要是一款网络监控工具,但Zabbix也可以用来监控MySQL服务器的性能指标,如CPU使用率、内存消耗、查询速率等,及时发现并解决潜在问题。 以上就是MySQL的一些常用管理工具及其功能,它们各具特色,...

    航空公司应用中的MySQL内存存储引擎.pdf

    在航空公司应用中,MySQL内存存储引擎可以应用于基础数据表的管理,如飞机、机型、航线、航班等信息。通过使用内存存储引擎,可以提高数据的访问速度和操作效率,提高航空公司的业务效率和服务质量。 四、航空公司...

    MySQLManager管理工具

    6. 性能监控:通过监控MySQL服务器的性能指标,如CPU使用率、内存占用、查询速度等,可以帮助优化数据库性能。工具可能提供实时图表和日志查看,以便找出性能瓶颈。 7. 用户权限管理:MySQLManager还可以帮助管理...

    mysql服务性能优化my_cnf配置说明详解16G内存[参考].pdf

    MySQL 是当前使用最广泛的开源数据库管理系统之一,高性能的 MySQL 服务器配置是每个开发者和 DBA 都需要关心的问题。下面是 MySQL 服务性能优化的 My.cnf 配置说明详解,基于 16G 内存的服务器配置。 1. 服务器...

    基于WEB的MYSQL数据库管理系统

    7. **性能监控**:显示数据库性能指标,如查询速度、内存使用情况、磁盘I/O等,帮助管理员优化数据库配置,提高性能。 8. **报表与图表**:提供数据可视化功能,将数据库中的信息转化为报表或图表,便于数据分析和...

Global site tag (gtag.js) - Google Analytics