当前位置: 澳门新濠3559 > 数据库 > 正文

MySQL中内存分为全局内存和线程内存两大部分(其

时间:2019-11-09 19:31来源:数据库
 本文出处:  首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的部分): MySQL变量的概念 个人认为可以理解成MySQL在启动或者运

 本文出处: 

首先我们来看一个公式,MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,只是影响比较大的 部分):

MySQL变量的概念
  个人认为可以理解成MySQL在启动或者运行过程中读取的一些参数问题,利用这些参数来启动服务、响应或者支持用户的请求等

复制代码 代码如下:

变量的配置
  如果打算长期使用,应该写入配置文件,而不是在命中指定,因为在命中设置的变量会随着MySQL服务的重启而恢复默认值
  另外要注意是设置的当前Session的变量还是全局的变量。

per_thread_buffers=(read_buffer_size+read_rnd_buffer_size+sort_buffer_size+thread_stack+join_buffer_size+binlog_cache_size
+tmp_table_size)*max_connections
global_buffers=
innodb_buffer_pool_size+innodb_additional_mem_pool_size+innodb_log_buffer_size+key_buffer_size+query_cache_size
total_memory=global_buffers+per_thread_buffers

变量单位
  不同的变量的单位不同,比如table_cache是指缓存的表的个数,而key_buffer_size则是以字节为单位
  另外还有以页或者百分比为单位的变量
  许多变量可以通过后缀制订单位,
  比如1M表示一百万字节,在配置文件中或者在命令行下有效,
  但是在使用set命令的时候,这些单位就无效,必须使用数字,单位为字节
  比如:set @@session.sort_buffer_MySQL中内存分为全局内存和线程内存两大部分(其实并不全部,变量的配置。size = 1024*1024或者set @@session.sort_buffer_size = 1048576
  但是配置文件中设置的时候就不能使用表达式

全局缓存:
key_buffer_size:
决定索引处理的速度,尤其是索引读的速度。默认值是16M,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用'key_read%'获得用来显示状态数据)。key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值'created_tmp_disk_tables'得知详情。

变量的作用域 
  有些变量的作用是服务器级别的,有些是Session级别的,剩下的的一些是对象级别的。
  许多回话的变量是全局变量相等,可以为是默认值
  如果改变会话级的变量,它只影响当前Session,当前Session关闭后当前设置的参数会失效
  举例:
  query_cache_size是全局级的
  sort_buffer_size可以在全局级设置,每个Session也可以独立设置
  join_buffer_size可以在全局级设置,也可以在Session级设置,一个查询中如果有多个表关联,可以为每个关联分配一个join buffer
  除了在配置文件中设置变量之外,(部分变量)也可以在运行时修改,MySQL称之为动态配置变量
  比如: set global sort_buffer_size = 1024*1024*1024
      set sort_buffer_size = 1024*1024*1024
      set @@sort_buffer_size = 1024*1024*1024
      set @@session.sort_buffer_size = 1024*1024*1024
      set @@global.sort_buffer_size = 1024*1024*1024

innodb_buffer_pool_size:InnoDB使用该参数指定大小的内存来缓冲数据和索引,这个是Innodb引擎中影响性能最大的参数。

常见变量的设置与获取资源说明:
  key_buffer_size
    为键缓冲区(key buffer,也叫键缓存key cache)分配所有指定的空间,
    操作系统不会为该设置立马分配内存,而是等到使用的时候才分配。
  table_cache_size
    当有线程打开表时,MySQL会检查这个标量的值,如果大于缓存中表的数量,线程可以把最先打开的表放入缓存,
    如果该值比缓存中的表数小,MySQL将从缓存中删除不常用的表
  thread_cache_size
    当有连接关闭时,MySQL检查缓存中是否还有空间来缓存线程。
    如果有:则缓存改线程已被下次连接重用
    如果没有:他讲销毁改线程而不再缓存,
    缓存中使用的线程数,不会立即减少,只有在新的连接删除缓存中的一个线程并使用后才会减少
    MySQL只在关闭连接时候才在缓冲中增减线程,在创建新的连接的时候才从缓存中删除线程
  query_cache_size
    MySQL启动的时候,一次性分配并且初始化这块内存,如果修改这个变量(即使设置为与当前值一样)
    MySQL会立刻删除所有缓存的查询,重新分配这片缓存到指定大小,并且重新初始化内存
  read_buffer_size
    MySQL只会在查询需要时才会为该缓存分配内存,并且会一次性分配改参数指定大小的全部内存
  read_rnd_buffer_size
    MySQL只会在查询需要时才会为该缓存分配内存,并且只分配需要的内存大小而不是全部指定的大小
    应该叫做,max_read_rnd_buffer_size
  sort_buffer_size
    MySQL只会在查询需要做排序操作的时候拆毁为该缓存分配内存,
    一旦需要排序,MySQL就会立刻分配给改参数指定大小的全部内存,而不管排序是否需要这么大的内存。

innodb_additional_mem_pool_size:指定InnoDB用来存储数据字典和其他内部数据结构的内存池大小。缺省值是8M。通常不用太大,只要够用就行,应该与表结构的复杂度有关系。如果不够用,MySQL会在错误日志中写入一条警告信息。

  由此可见,不用的变量,设置之后的启用时间,启用原理,生效方式等都是有一定差异的。

innodb_log_buffer_size:指定InnoDB用来存储日志数据的缓存大小,如果您的表操作中包含大量并发事务(或大规模事务),并且在事务提交前要求记录日志文件,请尽量调高此项值,以提高日志效率。

设置变量的潜在的影响
  动态设置全局变量可能会导致意外的副作用。
  某些变量改变后会立即生效,比如从缓冲中刷新赃块,从而引起服务器相应请求的一些不稳定甚至更严重的问题

query_cache_size:是MySQL的查询缓冲大小。(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。通过检查状态值'Qcache_%',可以知道query_cache_size设置是否合理:如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的情况,如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;如果Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。

线程缓存 每个连接到MySQL服务器的线程都需要有自己的缓冲。大概需要立刻分配256K,甚至在线程空闲时,它们使用默认的线程堆栈,网络缓存等。事务开始之后,则需要增加更多的空间。运行较小的查询可能仅给指定的线程增加少量的内存消耗,然而如果对数据表做复杂的操作例如扫描、排序或者需要临时表,则需分配大约read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size大小的内存空间。不过它们只是在需要的时候才分配,并且在那些操作做完之后就释放了。有的是立刻分配成单独的组块。tmp_table_size 可能高达MySQL所能分配给这个操作的最大内存空间了。

read_buffer_size:是MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。

sort_buffer_size:是MySQL执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。如果不能,可以尝试增加sort_buffer_size变量的大小。

read_rnd_buffer_size:是MySQL的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。

tmp_table_size:是MySQL的临时表缓冲大小。所有联合在一个DML指令内完成,并且大多数联合甚至可以不用临时表即可以完成。大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。还可以通过设置tmp_table_size选项来增加临时表的大小。也就是说,如果调高该值,MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果。

thread_stack :主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。

join_buffer_size:应用程序经常会出现一些两表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的时候(all/index join),为了减少参与Join的“被驱动表”的读取次数以提高性能,需要使用到 Join Buffer 来协助完成 Join操作。当 Join Buffer 太小,MySQL 不会将该 Buffer 存入磁盘文件,而是先将Join Buffer中的结果集与需要 Join 的表进行 Join 操作,然后清空 Join Buffer 中的数据,继续将剩余的结果集写入此 Buffer 中,如此往复。这势必会造成被驱动表需要被多次读取,成倍增加 IO 访问,降低效率。

binlog_cache_size:在事务过程中容纳二进制日志SQL 语句的缓存大小。二进制日志缓存是服务器支持事务存储引擎并且服务器启用了二进制日志(—log-bin 选项)的前提下为每个客户端分配的内存,注意,是每个Client 都可以分配设置大小的binlog cache 空间。如果系统中经常会出现多语句事务的话,可以尝试增加该值的大小,以获得更好的性能。当然,我们可以通过MySQL 的以下两个状态变量来判断当前的binlog_cache_size 的状况:Binlog_cache_use 和Binlog_cache_disk_use。“max_binlog_cache_size”:和"binlog_cache_size"相对应,但是所代表的是binlog 能够使用的最大cache 内存大小。当我们执行多语句事务的时候,max_binlog_cache_size 如果不够大的话,系统可能会报出“ Multi-statement transaction required more than 'max_binlog_cache_size' bytes ofstorage”的错误。
其中需要注意的是:table_cache表示的是所有线程打开的表的数目,和内存无关。

您可能感兴趣的文章:

  • MySQL优化之缓存优化
  • 清空mysql 查询缓存的可行方法
  • mysql的查询缓存说明
  • 使用Memcache缓存mysql数据库操作的原理和缓存过程浅析
  • MySQL高速缓存启动方法及参数详解(query_cache_size)
  • MySQL缓存的查询和清除命令使用详解
  • mysql 设置查询缓存
  • MySQL DBA教程:Mysql性能优化之缓存参数优化
  • MySQL优化之缓存优化(续)

编辑:数据库 本文来源:MySQL中内存分为全局内存和线程内存两大部分(其

关键词:

  • 上一篇:没有了
  • 下一篇:没有了