浅谈MySQL Buffer学习及思考

    本博文旨在结合本身看书理解,并借此图进行说明,若有谬误,望你们指正,以共同探讨为目的,交流学习。
首先介绍一下此图的由来:最近看关于mysql方面书籍的一点心得,把文字转化成图片而得,方便理解。
 

而后对以上参数进行一下简单的介绍:
 
  
  
  
  
  1. 一、max_connections这个参数,这个参数指MySql的最大链接数,若是服务器的并发链接请求量比较大,建议调高此值,以增长并行链接数量,服务器根据本身的实际状况进行增长,若是链接数越多,因MySql会为每一个链接提供链接缓冲区,就会开销越多的内存,因此要适当调整该值,不能盲目提升设值。能够过mysql -e "SHOW VARIABLES LIKE 'max_connections';"查看当前状态的链接数量来设定该值大小。当你常看到Too many connections 错误,能够增长此值了,默认是100。 
  2.  
  3. 二、back_log这个参数主要是基于max_connections进行的一个额外链接,也就是说当mysql链接大于max_connections设置的值的话,而又在(max_connections+back_log)之间,则mysql会把新链接放到堆栈中,等待以前链接的process释放,若是当前最大请求超过了(max_connections+back_log),就不会受权链接,固然该值也受约于系统的TCP/IP链接的侦听队列(系统的tcp_max_syn_backlog值的大小),能够经过cat /proc/sys/net/ipv4/tcp_max_syn_backlog查看,固然能够修改该值 
  4. sysctl -w net.ipv4.tcp_max_syn_backlog=N或在/etc/sysctl.conf中添加tcp_max_syn_backlog=N便可。 
  5.  

 
    因为mysql被称为内存式数据库,固然很内存是密不可分了,而他和内存的关系主要是经过缓冲区大小的几个参数吧。
 
缓冲包括:全局缓冲和局部缓冲
 
全局缓冲参数大体有以下:
key_buffer_size, innodb_buffer_pool_size, innodb_additional_mem_pool_size,innodb_log_buffer_size, query_cache_size 
而局部缓冲(我本身习惯这么叫,虽然不专业,呵呵)通常mysql还会为每一个链接分配链接缓冲。
全局缓冲在上篇博客中有介绍,这地方就省略了。
 
局部缓存:
    每一个链接到MySQL服务器的线程都须要有本身的缓冲。大概须要马上分配256K,甚至在线程空闲时,它们使用默认的线程堆栈,网络缓存等。事务开始以后,则须要增长更多的空间。运行较小的查询可能仅给指定的线程增长少许的内存消耗,然而若是对数据表作复杂的操做例如扫描、排序或者须要临时表,则需分配大约read_buffer_size,sort_buffer_size,read_rnd_buffer_size,tmp_table_size大小的内存空间。不过它们只是在须要的时候才分配,而且在那些操做作完以后就释放了。有的是马上分配成单独的组块。tmp_table_size可能高达MySQL所能分配给这个操做的最大内存空间了。注意,这里须要考虑的不仅有一点——可能会分配多个同一种类型的缓存,例如用来处理子查询。一些特殊的查询的内存使用量可能更大——若是在MyISAM表上作成批的插入时须要分配bulk_insert_buffer_size 大小的内存;执行 ALTER TABLE, OPTIMIZE TABLE, REPAIR TABLE命令时须要分配myisam_sort_buffer_size大小的内存。 
 
 
  
  
  
  
  1. read_buffer_size是MySql读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。若是对表的顺序扫描请求很是频繁,而且你认为频繁扫描进行得太慢,能够经过增长该变量值以及内存缓冲区大小提升其性能。  
  2.  
  3. sort_buffer_size是MySql执行排序使用的缓冲大小。若是想要增长ORDER BY的速度,首先看是否可让MySQL使用索引而不是额外的排序阶段。若是不能,能够尝试增长sort_buffer_size变量的大小。  
  4.  
  5. read_rnd_buffer_size是MySql的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以免磁盘搜索,提升查询速度,若是须要排序大量数据,可适当调高该值。但MySql会为每一个客户链接发放该缓冲空间,因此应尽可能适当设置该值,以免内存开销过大。  
  6.  
  7. tmp_table_size是MySql的heap(堆积)表缓冲大小。全部联合在一个DML指令内完成,而且大多数联合甚至能够不用临时表便可以完成。大多数临时表是基于内存的(HEAP)表。具备大的记录长度的临时表(全部列的长度的和)或包含BLOB列的表存储在硬盘上。若是某个内部heap(堆积)表大小超过tmp_table_size,MySQL能够根据须要自动将内存中的heap表改成基于硬盘的MyISAM表。还能够经过设置tmp_table_size选项来增长临时表的大小。也就是说,若是调高该值,MySql同时将增长heap表的大小,可达到提升联接查询速度的效果。 
 
  以上是结合本身经常使用的参数并查询mysql手册总结的。方便更直观的学习和理解。 均我的看法,若有疑问,可共同交流学习!
相关文章
相关标签/搜索