(1)max_connections
最大链接数。默认值是151,最多2000。若是服务器的并发链接请求量比较大,建议调高此值,以增长并行链接数量。可是若是链接数越多,介于MySQL会为每一个链接提供链接缓冲区,就会开销越多的内存,因此要适当调整该值。
查看最大链接数html
mysql> SHOW VARIABLES LIKE 'max_connections';
查看响应的链接数mysql
mysql> SHOW STATUS LIKE 'max%connections';
max_used_connections / max_connections * 100% (理想值≈85%)
若是max_used_connections跟max_connections相同 那么就是max_connections设置太低或者超过服务器负载上限了,低于10%则设置过大。
(2)back_log
MySQL能暂存的链接数量,默认值是80,最多512,可设置为128。若是MySQL的链接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一链接释放资源,该堆栈的数量即back_log。若是等待链接的数量超过back_log,将不被授予链接资源。当主要MySQL线程在一个很短期内获得很是多的链接请求,这就起做用。
(3)key_buffer_size
索引缓冲区的大小,它决定索引处理的速度,尤为是索引读的速度。
经过检查状态值Key_read_requests和Key_reads,能够知道key_buffer_size设置是否合理。sql
mysql> SHOW STATUS LIKE 'key_read%'; +-------------------+----------+ | Variable_name | Value | +-------------------+----------+ | Key_read_requests | 90585564 | | Key_reads | 97031 | +-------------------+----------+
计算索引未命中缓存的几率:
key_cache_miss_rate = Key_reads / Key_read_requests * 100%,设置在1/1000左右较好
key_buffer_size只对MyISAM表起做用。即便你不使用MyISAM表,可是内部的临时磁盘表是MyISAM表,也要使用该值。
默认配置数值是8388608(8M),主机有4GB内存,可改成268435456(256M)
(4)query_cache_size
使用查询缓存(query cache),MySQL将查询结果存放在缓冲区中,从此对于一样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。
最佳选项是将其从一开始就停用,设为0(如今MySQL 5.6的默认值)并利用其余方法加速查询:优化索引、增长拷贝分散负载或者启用额外的缓存(好比Redis或Memcached)。
经过检查状态值qcache_*,能够知道query_cache_size设置是否合理数据库
mysql> SHOW STATUS LIKE 'qcache%'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 1031360 | | Qcache_hits | 0 | | Qcache_inserts | 0 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 10302865 | | Qcache_queries_in_cache | 0 | | Qcache_total_blocks | 1 | +-------------------------+----------+
查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
若是查询缓存碎片率超过20%,能够用FLUSH QUERY CACHE整理缓存碎片,或者试试减少query_cache_min_res_unit,若是你的查询都是小数据量的话。
查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%
查询缓存利用率在25%如下的话说明query_cache_size设置的过大,可适当减少;查询缓存利用率在80%以上并且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。
查询缓存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
若是Qcache_lowmem_prunes的值很是大,则代表常常出现缓冲不够的状况,若是Qcache_hits的值也很是大,则代表查询缓冲使用很是频繁,此时须要增长缓冲大小;若是Qcache_hits的值不大,则代表你的查询重复率很低,这种状况下使用查询缓冲反而会影响效率,那么能够考虑不用查询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE能够明确表示不使用查询缓冲。
与查询缓冲有关的参数还有query_cache_type、query_cache_limit、query_cache_min_res_unit。
query_cache_type指定是否使用查询缓冲,能够设置为0、一、2,该变量是SESSION级的变量。
query_cache_limit指定单个查询可以使用的缓冲区大小,缺省为1M。
query_cache_min_res_unit指定分配缓冲区空间的最小单位,缺省为4K。检查状态值Qcache_free_blocks,若是该值很是大,则代表缓冲区中碎片不少,这就代表查询结果都比较小,此时须要减少query_cache_min_res_unit。
(5)read_buffer_size
是MySQL读入缓冲区的大小,将对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区,read_buffer_size变量控制这一缓冲区的大小,若是对表的顺序扫描很是频繁,并你认为频繁扫描进行的太慢,能够经过增长该变量值以及内存缓冲区大小提升其性能。
默认数值是131072(128K),可改成16773120(16M)
(6)read_rnd_buffer_size
随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySQL会首先扫描一遍该缓冲,以免磁盘搜索,提升查询速度,若是须要排序大量数据,可适当调高该值。但MySQL会为每一个客户链接发放该缓冲空间,因此应尽可能适当设置该值,以免内存开销过大。
默认数值是262144(256K),可改成16777208(16M)
(7)sort_buffer_size
每一个须要进行排序的线程分配该大小的一个缓冲区。增长这值加速ORDER BY或GROUP BY操做。
默认数值是10485760(1M),可改成16777208(16M)
(8)join_buffer_size
联合查询操做所能使用的缓冲区大小
read_buffer_size,read_rnd_buffer_size,sort_buffer_size,join_buffer_size为每一个线程独占,也就是说,若是有100个线程链接,则占用为16M*100
(9)table_open_cache
表高速缓存的大小。每当MySQL访问一个表时,若是在表缓冲区中还有空间,该表就被打开并放入其中,这样能够更快地访问表内容。
经过检查峰值时间的状态值Open_tables和Opened_tables,能够决定是否须要增长table_cache的值。缓存
mysql> SHOW STATUS LIKE 'open%tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 2000 | | Opened_tables | 0 | +---------------+-------+
若是open_tables等于table_cache,而且opened_tables在不断增加,那么就须要增长table_cache的值了。注意,不能盲目地把table_cache设置成很大的值。若是设置得过高,可能会形成文件描述符不足,从而形成性能不稳定或者链接失败。
1G内存机器,推荐值是128-256。内存在4GB左右的服务器该参数可设置为256M或384M。
(10)max_heap_table_size
用户能够建立的内存表(memory table)的大小。这个值用来计算内存表的最大行数值。
这个变量和tmp_table_size一块儿限制了内部内存表的大小。若是某个内部heap(堆积)表大小超过tmp_table_size,MySQL能够根据须要自动将内存中的heap表改成基于硬盘的MyISAM表。
(11)tmp_table_size
临时表的大小,例如作高级GROUP BY操做生成的临时表。若是调高该值,MySQL同时将增长heap表的大小,可达到提升联接查询速度的效果,建议尽可能优化查询,要确保查询过程当中生成的临时表在内存中,避免临时表过大致使生成基于硬盘的MyISAM表。安全
mysql> SHOW GLOBAL STATUS LIKE 'created_tmp%'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Created_tmp_disk_tables | 2884297 | | Created_tmp_files | 870 | | Created_tmp_tables | 15899696 | +-------------------------+----------+
每次建立临时表,Created_tmp_tables增长,若是临时表大小超过tmp_table_size,则是在磁盘上建立临时表,Created_tmp_disk_tables也增长。
Created_tmp_files表示MySQL服务建立的临时文件文件数,比较理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%
(12)thread_cache_size
线程缓存。当客户端断开以后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。服务器
mysql> SHOW STATUS LIKE 'threads%'; +-------------------+---------+ | Variable_name | Value | +-------------------+---------+ | Threads_cached | 5 | | Threads_connected | 13 | | Threads_created | 1095313 | | Threads_running | 1 | +-------------------+---------+
Threads_cached :表明当前此时此刻线程缓存中有多少空闲线程。若是过大,代表MySQL服务器一直在建立线程,这也是比较耗资源,能够适当增长thread_cache_size
Threads_connected :表明当前已创建链接的数量,由于一个链接就须要一个线程,因此也能够当作当前被使用的线程数。
Threads_created :表明从最近一次服务启动,已建立线程的数量。
Threads_running :表明当前激活的(非睡眠状态)线程数。并非表明正在使用的线程数,有时候链接已创建,可是链接处于sleep状态,这里相对应的线程也是sleep状态。
建议设置接近Threads_connected值,再结合物理内存:1G-8;2G-16;3G-32 综合考虑一下值。
(13)interactive_timeout
一个交互链接在被服务器在关闭前等待行动的秒数。默认值是28800(8小时),可设置为7200。
(14)wait_timeout
一个非交互链接在被服务器在关闭前等待行动的秒数。要同时设置interactive_timeout和wait_timeout才会生效。数据结构
(1)innodb_buffer_pool_size
缓冲池的大小,缓存数据和索引,对InnoDB总体性能影响较大,至关于MyISAM的key_buffer_size。若是只用Innodb,能够把这个值设为内存的70%-80%。越大越好,这能保证你在大多数的读取操做时使用的是内存而不是硬盘。
(2)innodb_log_buffer_size
还没有执行的事务的缓存大小,默认值为8M,通常8M-16M。若是你有不少事务的更新,插入或删除操做,经过这个参数会大量的节省了磁盘I/O。可是若是你的事务中包含有二进制大对象或者大文本字段的话,这点缓存很快就会被填满并触发额外的I/O操做。看看Innodb_log_waits状态变量,若是它不是0,应该增大这个值。但太大了也是浪费内存,由于1秒钟总会flush一次,因此不须要设到超过1秒的需求。
(3)innodb_flush_log_at_trx_commit
把log buffer的数据写入日志文件并flush磁盘的策略,该值对插入数据的速度影响很是大。取值分别为0、1(默认值)、2(推荐值)
0:事务提交时,不写入磁盘,而是每秒把log buffer的数据写入日志文件,而且flush(刷到磁盘)。速度最快,但不安全。mysqld进程的崩溃会致使上一秒钟全部事务数据的丢失。
1:每次事务提交时把log buffer的数据写入日志文件,而且flush(刷到磁盘)。最安全,但也最慢。确保了事务的ACID。
2:每次事务提交时把log buffer的数据写入日志文件,每秒flush(刷到磁盘)。速度较快,比0安全。操做系统崩溃或者系统断电会致使上一秒钟全部事务数据的丢失。
(4)innodb_log_file_size
在一个日志组每一个日志文件的大小,用于确保写操做快速而可靠而且在崩溃时恢复。通常用64M-512M,具体取决于服务器的空间。大的文件提供更高的性能,但数据库恢复时会用更多的时间。
(5)innodb_additional_mem_pool_size
存储数据字典和其余内部数据结构的内存池大小。默认为1M,对于2G内存的机器,推荐值是20M,一般不用太大,应该与表结构的复杂度有关系。若是不够用,MySQL会在错误日志中写入一条警告信息。
(6)innodb_buffer_pool_instances
能够开启多个内存缓冲池,这样能够并行的内存读写。默认为8,通常为1-8。最常1s就会刷新一次,故不用太大。对于较大的事务,能够增大缓存大小。若是InnoDB缓存池被划分红多个区域,建议每一个区域不小于1GB的空间。并发