MySQL数据库服务器优化详细

最近在网上查了一些有关优化MySql的资料,并对照MySql手册对一些调优设置进行了细结,可是因为时间比较勿忙,没来得及对这些设置进行实验/测试,你能够把这些方法应用到实际中,得出具体结论。mysql

调优方法大体以下:
sql

MySql服务器的后台管理程序,要想使用客户端程序,该程序必须运行,由于客户端经过链接服务器来访问数据库。下面让咱们以服务器的系统变量和状态变量为根据,优化咱们的MySql数据库服务。在这以前,咱们须要掌握如下方法:
数据库

查看MySql状态及变量的方法:
缓存

Mysql> show status ——显示状态信息(扩展show status like 'XXX')服务器

Mysql> show variables ——显示系统变量(扩展show variables like 'XXX')网络

Mysql> show innodb status ——显示InnoDB存储引擎的状态数据结构

Shell> mysqladmin variables -u username -p password——显示系统变量并发

Shell> mysqladmin extended-status -u username -p password——显示状态信息性能

 

查看状态变量及帮助:测试

Shell> mysqld --verbose --help [|more #逐行显示]

 

首先,让咱们看看有关请求链接的变量:

为了能适应更多数据库应用用户,MySql提供了链接(客户端)变量,以对不一样性质的用户群体提供不一样的解决方案,笔者就max_connections,back_log 作了一些细结,以下:

max_connections 是指MySql的最大链接数,若是服务器的并发链接请求量比较大,建议调高此值,以增长并行链接数量,固然这创建在机器能支撑的状况下,由于若是链接数越 多,介于MySql会为每一个链接提供链接缓冲区,就会开销越多的内存,因此要适当调整该值,不能盲目提升设值。能够过'conn%'通配符查看当前状态的 链接数量,以定夺该值的大小。

back_log 是要求MySQL能有的链接数量。当主要MySQL线程在一个很短期内获得很是多的链接请求,这就起做用,而后主线程花些时间(尽管很短)检查链接而且 启动一个新线程。back_log值指出在MySQL暂时中止回答新请求以前的短期内多少个请求能够被存在堆栈中。若是指望在一个短期内有不少链接, 你须要增长它。也就是说,若是MySql的链接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一链接释放资源,该堆栈 的数量即back_log,若是等待链接的数量超过back_log,将不被授予链接资源。另外,这值(back_log)限于您的操做系统对到来的 TCP/IP链接的侦听队列的大小。你的操做系统在这个队列大小上有它本身的限制(能够检查你的OS文档找出这个变量的最大值),试图设定 back_log高于你的操做系统的限制将是无效的。

优化了MySql的链接后属性后,咱们须要看看缓冲区变量:

使用MySql数据库存储大量数据(或使用复杂查询)时,咱们应该考虑MySql的内存配置。若是配置MySQL服务器使用太少的内存会致使性 能不是最优的;若是配置了太多的内存则会致使崩溃,没法执行查询或者致使交换操做严重变慢。在如今的32位平台下,仍有可能把全部的地址空间都用完,所以 须要审视。

计算内存使用的秘诀公式就能相对地解决这一部分问题。不过,现在这个公式已经很复杂了,更重要的是,经过它计算获得的值只是“理论可能”并非 真正消耗的值。事实上,有8GB内存的常规服务器常常能运行到最大的理论值(100GB甚至更高)。此外,你轻易不会使用到“超额因素”(它实际上依赖于 应用以及配置)。一些应用可能须要理论内存的10%而有些仅需1%。

那么,咱们能够作什么呢?

 

来看看那些在启动时就须要分配而且老是存在的全局缓冲吧!

 

全局缓冲:

key_buffer_size, innodb_buffer_pool_size, innodb_additional_mem_pool_size,innodb_log_buffer_size, query_cache_size

 

注:若是你大量地使用MyISAM表,那么你也能够增长操做系统的缓存空间使得MySQL也能用得着。把这些也都加到操做系统和应用程序所需的 内存值之中,可能须要增长32MB甚至更多的内存给MySQL服务器代码以及各类不一样的小静态缓冲。这些就是你须要考虑的在MySQL服务器启动时所需的 内存。其余剩下的内存用于链接。

 

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'得知详情。

 

innodb_buffer_pool_size 对于InnoDB表来讲,做用就至关于key_buffer_size对于MyISAM表的做用同样。InnoDB使用该参数指定大小的内存来缓冲数据和 索引。对于单独的MySQL数据库服务器,最大能够把该值设置成物理内存的80%。

 

innodb_additional_mem_pool_size 指定InnoDB用来存储数据字典和其余内部数据结构的内存池大小。缺省值是1M。一般不用太大,只要够用就行,应该与表结构的复杂度有关系。若是不够用,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还会为每一个链接发放链接缓冲。

 

链接缓冲:

每一个链接到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 大小的内存。

 

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的heap (堆积)表缓冲大小。全部联合在一个DML指令内完成,而且大多数联合甚至能够不用临时表便可以完成。大多数临时表是基于内存的(HEAP)表。具备大的 记录长度的临时表 (全部列的长度的和)或包含BLOB列的表存储在硬盘上。若是某个内部heap(堆积)表大小超过tmp_table_size,MySQL能够根据须要 自动将内存中的heap表改成基于硬盘的MyISAM表。还能够经过设置tmp_table_size选项来增长临时表的大小。也就是说,若是调高该 值,MySql同时将增长heap表的大小,可达到提升联接查询速度的效果。

 

当咱们设置好了缓冲区大小以后,再来看看:

 

table_cache 全部线程打开的表的数目,增大该值能够增长mysqld须要的文件描述符的数量。每当MySQL访问一个表时,若是在表缓冲区中还有空间,该表就被打开并 放入其中,这样能够更快地访问表内容。经过检查峰值时间的状态值’Open_tables’和’Opened_tables’,能够决定是否须要增长 table_cache的值。若是你发现open_tables等于table_cache,而且opened_tables在不断增加,那么你就须要增 加table_cache的值了(上述状态值可使用’Open%tables’得到)。注意,不能盲目地把table_cache设置成很大的值。若是 设置得过高,可能会形成文件描述符不足,从而形成性能不稳定或者链接失败。

 

作了以上方面的调优设置以后,MySql应该基本能知足您需求(固然是创建在调优设置适当的状况下),咱们还应该了解并注意:

 

只有简单查询OLTP(联机事务处理)应用的内存消耗常常是使用默认缓冲的每一个线程小于1MB,除非须要使用复杂的查询不然无需增长每一个线程的 缓冲大小。使用1MB的缓冲来对10行记录进行排序和用16MB的缓冲基本是同样快的(实际上16MB可能会更慢,不过这是其余方面的事了)。

 

找出MySQL服务器内存消耗的峰值。这很容易就能计算出操做系统所需的内存、文件缓存以及其余应用。在32位环境下,还须要考虑到32位的限 制,限制 “mysqld” 的值大约为2.5G(实际上还要考虑到不少其余因素)。如今运行 “ps aux” 命令来查看 “VSZ” 的值(MySQL 进程分配的虚拟内存)。监视着内存变化的值,就能知道是须要增长或减小当前的内存值了。

 

最后来看看调优设置方法:

 

安装好MySql后,配制文件应该在 ./share/mysql ("./"即MySql安装目录) 目录中,配制文件有几个,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf。win环境下即存在于MySql安装目录中的.ini文件。不一样的流量的网站和不一样配制的服务器环境,固然须要有不一样的配制文 件了。

通常的状况下,my-medium.cnf这个配制文件就能知足咱们的大多须要;通常咱们会把配置文件拷贝到 /etc/my.cnf ,win环境下则拷备到 my.ini 下便可,只须要修改这个配置文件就能够了。

相关文章
相关标签/搜索