MySQL调优参数配置详解

一、mysql参数调优知识铺垫

1、一些生产常用查询命令

-- 查看数据库里正在执行的sql语句
show processlist;
 
-- 查看正在执行的完整sql语句,完整显示
show full processlist;
 
-- 查看数据库的配置参数信息,例如:my.cnf里参数的生效情况
show variables;
 
-- MySQL服务器运行各种状态值,查询MySQL服务器配置信息语句
show variables like '%log_bin%';
 
-- 查看当前会话的数据库状态信息
show session status;
 
-- 查看整个数据库运行状态信息,分析并做好监控
show global status;
 
-- 显示innodb 引擎的性能状态
show engine innodb status;
 
-- 登陆数据库现场抓(显示完整的进程列表)
show full processlist;
 
-- explain语句检查索引执行情况,将上边抓到的慢语句,进行一个索引检查
explain select * from test_table where ***

2、分析慢查询

生产者中,一般设置如果执行时间超过0.2、0.5、1秒,就是慢查询。一般可以分析缓慢的查询日志,找出有问题的SQL语句。慢速查询时间不应设置得太长,否则就没有意义。最好在2秒内。

-- 查看数据库的配置参数信息
show variables like '%slow%';
 
-- 查看整个数据库运行状态信息
show global status like '%slow%'; 

打开慢速查询日志可能会对系统性能产生轻微影响,如果您的MySQL是主从结构,您可以考虑打开其中一个从属服务器的慢速查询日志,这样您就可以监视慢速查询,对系统性能几乎没有影响。

3、分析连接数

-- 查询MySQL服务器最大连接数(可以理解为设置的最大连接数)
show variables like 'max_connections';
 
-- 查询服务器响应的最大连接数(可以理解为应用的最大连接数)
show global status like 'Max_used_connections';

过去,MySQL服务器的最大连接数为 Max_used_connections,未达到与服务器的最大连接数 max_connections ,没有问题。

理想的设置是:Max_used_connections / max_connections * 100% ≈ 85%

最大连接数约占最大连接数的85%。如果该比例小于10%,则MySQL服务器的最大连接数设置得太高。

4、缓冲区调优 Key_buffer_size

Key_buffer_size 是对MyISAM表性能影响最大的参数。缓存 MyISAM 表索引以提高 MyISAM 表索引的读写效率。

用于索引块的缓冲区大小可以更好地处理的索引。

对MyISAM表的影响不大。MyISAM将使用系统缓存来存储数据,因此大量使用MyISAM表的计算机的内存将很快耗尽。但是,如果您将此值设置得太高(例如,大于总内存的50%),系统将转换为页面并变得非常缓慢。MySQL在读取数据时依赖于操作系统来执行文件系统缓存,因此必须为文件系统缓存留出一些空间。

建议将其设置为25%的内存,并观察性能变化。

-- 查看分配了多少内存给key_buffer_size
show variables like 'key_buffer_size';
 
-- 查看索引读取请求、查看请求在内存中没有找到直接从硬盘读取索引
show global status like 'key_read%'; 

计算索引未命中缓存的概率:key_cache_miss_rate = Key_reads / Key_read_requests * 100%

-- Key_blocks_unused表示未使用的缓存簇blocks数
-- Key_blocks_used表示曾经用到的最大的blocks数
show global status like 'key_blocks_u%'; 

比如服务器的所有缓存都用到了,要么增加 key_buffer_size 。比较理想的设置:Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%

5、临时表调优 Created_tmp_tables

-- 查看在磁盘上创建临时表
show global status like 'created_tmp'
 
-- 查看MySQL服务器对临时表的配置
show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size'); 

每次创建临时表时,都会添加 Created_tmp_tables。如果要在磁盘上创建临时表,Created_tmp_disk_Tables也会增加,Created_tmp_files 表示MySQL服务创建的临时文件的数量。

理想的配置是:Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%

6、分析 Open Table 使用情况

-- Open_tables表示打开表的数量,如果Opened_tables数量过大,说明配置中 table_open_cache 值可能太小
show global status like 'open%tables%';
 
-- 查询一下服务器table_cache值
show variables like 'table_cache';

7、查看 MySQL 进程使用情况

thread_cache_size 缓存可重用的线程数,此参数设置线程缓存。线程创建和销毁的成本可能很高,因为每个线程都需要连接/断开连接。如果应用程序具有大量跳转并发连接和更多线程,请增加其值。它旨在避免在正常操作中创建新线程。建议将其设置为至少16。

show global status like 'Thread%'; 
 
-- 查询服务器thread_cache_size配置
show variables like 'thread_cache_size'; 

如果我们在MySQL服务器配置文件中设置 thread_cache_size。当客户端断开连接时,处理此客户端的服务器线程将被缓存以响应下一个客户端,而不是销毁它(前提是缓存数量未达到上限)。

Threads_created 表示创建的线程数。如果发现创建的值太大,则表明MySQL服务器一直在创建线程,这也会消耗资源。您可以在配置文件中适当地添加 thread_cache_size 值。

8、查询缓存 query cache

query_cache_size 指定MySQL查询结果缓冲区的大小,如果应用程序具有大量读取且没有应用程序级缓存,则此选项非常有用。但是,不要将其设置得太大,因为维护它也需要大量开销,这会导致MySQL速度减慢。

-- 查询 query_cache
show global status like 'qcache%'; 
 
-- 查询服务器 query_cache 配置
show variables like 'query_cache%';

query_cache_limit:缓存上限,超过此大小的查询将不会被缓存,缓存单条SQL的结果集上限。默认4KB。当一条SQL返回的结果集大于这个限制的时候,将不被MySQL缓存。

query_cache_min_res_unit:缓存块的最小大小,缓存是每个数据集的最小内存大小。默认大小为4KB。如果它太小,MySQL将经常访问内存块以获取信息。如果设置得太大,内存将被浪费。如果SQL返回的结果集非常小,还可以减少参数以避免内存浪费。如果大多数结果集大于4KB,请考虑增加参数。
query_cache_size:查询缓存大小 query_cache_type:缓存类型,它决定要缓存的查询。在本例中,这意味着不缓存
select sql_no_cache 查询
query_cache_wlock_invalidate:当其他客户端正在写入MyISAM表时,如果查询在 query cache
中,则在读取表以获取结果之前,是返回缓存结果还是等待写入操作完成。 计算缓存碎片率:Qcache_free_blocks /
Qcache_total_blocks * 100%

计算缓存利用率:(query_cache_size - Qcache_free_memory) / query_cache_size *
100%

计算缓存命中率:(Qcache_hits - Qcache_inserts) / Qcache_hits * 100%

query_cache_min_res_unit,默认值为4KB。大的设置对于大数据查询很好,但如果您的查询都是小数据查询,则很容易导致内存碎片和浪费。如果查询缓存碎片率超过20%,则可以使用 FLUSH QUERY CACHE 对缓存碎片进行碎片整理,或者如果查询都是小数据,则可以尝试减少 query_cache_min_res_unit 。如果查询缓存利用率低于25%,query_cache_size 如果大小设置得太大,可以适当减小。

9、分析SQL排序、锁、文件使用与表扫描情况

-- 分析SQL排序使用情况
show global status like 'sort%'; 

表扫描率 = Handler_read_rnd_next / Com_select,如果表扫描速率超过4000,则表明执行了太多的表扫描。很可能索引尚未构建,并且已添加读取缓冲区(read_buffer_size)大小值有一些优势,但最好不要超过8MB。

-- 查看文件打开数
show global status like 'open_files';
-- 查看配置 Open_files / open_files_limit * 100% <= 75%
show variables like 'open_files_limit';
 
-- 查看表锁
show global status like 'table_locks%';
 
-- 查询MySQL服务器完成的查询请求次数:
show global status like 'com_select';

二、重要参数

参数:max_connections
1)简述
Mysql的最大连接数,如果服务器并发请求量比较大,可以调高这个值(要建立在机器可以支撑的情况下,因为连接数越来越多,mysql会为每个连接提供缓冲区,就会消耗更多内存,所以不能随便的调高该值

2)查看

# 最大连接数
show variables like ‘max_connections’;
# 响应的连接数
show status like ‘max_used_connections’;

3)调优
max_used_connections 数量就是当前连接数量。
max_used_connections / max_connections * 100% (理想值≈ 85%)
如果max_used_connections跟max_connections相同 那么就是max_connections设置过低或者超过服务器负载上限了,低于10%则设置过大。
MySQL的max_connections 参数用来设置最大连接(用户)数。每个连接MySQL的用户均算作一个连接,max_connections 的默认值为 151
与max_connections有关的特性
MySQL无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,即使当前连接数已经达到了max_connections。因此MySQL的实际最大可连接数为max_connections+1;
这个参数实际起作用的最大值(实际最大可连接数)为16384,即该参数最大值不能超过16384,即使超过也以16384为准;
增加max_connections参数的值,不会占用太多系统资源。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等;

vim /etc/my.cnf 
max_connections=1024

参数:back_log

1)简述
back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。也就是说,如果MySql的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。将会报:unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时.

2)查看

# 查看当前数量
show variables like 'back_log';

3)调优
back_log值不能超过TCP/IP连接的侦听队列的大小。若超过则无效,查看当前系统的TCP/IP连接的侦听队列的大小命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog,目前操作系统一般为1024。对于Linux系统推荐设置为小于512的整数
修改系统内核参数,可以编辑/etc/sysctl.conf去调整它。如:net.ipv4.tcp_max_syn_backlog = 2048,改完后执行sysctl -p 让修改立即生效。

参数:wait_timeout 和 interactive_timeout
1)简述
wait_timeout – 指的是mysql在关闭一个非交互的连接之前所要等待的时间,默认为8小时。
interactive_time – 指的是mysql在关闭一个交互的连接之前所要等待的秒数(交互连接如mysql gui tool中的连接)
设置这个值是非常有意义的,比如你的网站有大量的MySQL链接请求(每个MySQL连接都是要内存资源开销的 ),由于你的程序的原因有大量的连接请求空闲啥事也不干,白白占用内存资源,或者导致MySQL超过最大连接数从来无法新建连接导致“Too many connections”的错误。在设置之前你可以查看一下你的MYSQL的状态(可用show processlist),如果经常发现MYSQL中有大量的Sleep进程,则需要 修改wait-timeout值了。
interactive_timeout:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。

2)查看

show variables like 'wait_timeout'

3)调优
wait_timeout:对性能的影响
(1)如果设置太小,那么连接关闭的很快,从而使一些持久的连接不起作用
(2)如果设置太大,容易造成连接打开时间过长,在show processlist时,能看到太多的sleep状态的连接,从而造成too many connections错误
(3)一般希望wait_timeout尽可能地低,(wait_timeout=1800,interactive_timeout=3600)
说明:长连接的应用,为了不反复的分配和回收资源,降低额外开销,一般我们会将wait_timeout设定的比较小,interactive_timeout要和应用开发人员沟通长连接的应用是否很多,如果他们需要长连接,那么这个值不用修改,interactive_timeout的设置对你的web application没有多大的影响

参数:innodb_buffer_pool_size

1)简述
它的是一个内存区域,用来缓存 InnoDB存储引擎的表中的数据和索引数据。以便提高对 InnoDB存储引擎表中数据的查询访问速度。

2)查看

show variables like 'innodb_buffer_pool_size'

在查看 innodb_buffer_pool_size这个参数值的时候,是以 字节(byte)为单位进行展现的。它的默认值为 134217728字节,也就是 128MB(134217728/1204/1024=128MB,1MB=1024KB,1KB=1024Byte)。

3)调优
此参数设置为物理内存的:60%~80%比较合适。
在MySQL 5.7.5版本后,可以在不重启MySQL数据库服务的情况下,动态修改这个参数的值,但是在此版本之前的老版本修改后需要重启数据库服务才可以生效。

参数:key_buffer_size

索引块的缓存大小,增加会提升索引处理速度,对MyISAM表性能影响最大。对于内存4G左右,可设为256M或384M,通过查询show status like ‘key_read%’,保证key_reads / key_read_requests在0.1%以下最好。

参数:query_cache_size

1)简述
启用查询缓存可以提高查询性能,因为经常执行的查询可以从缓存中直接获取结果。然而,对于具有大量更新、删除或插入操作的数据库,启用查询缓存可能会降低性能。

参数:tmp_table_size 和 max_heap_table_size

这两个参数控制缓存中生成的临时表的大小。请确保它们的值足够大,以避免频繁创建和删除临时表。

参数:thread_concurrency

并发线程数,设为CPU核数的两倍。

参数:query_cache_size

缓存MySQL中的ResultSet,也就是一条SQL语句执行的结果集,所以仅仅只能针对select语句。当某个表的数据有任何变化,都会导致所有引用了该表的select语句在Query Cache中的缓存数据失效。所以,当我们数据变化非常频繁的情况下,使用Query Cache可能得不偿失。根据命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))进行调整,一般不建议太大,256MB可能已经差不多了,大型的配置型静态数据可适当调大。可以通过命令show status like 'Qcache_%'查看目前系统Query catch使用大小。

参数:read_buffer_size

MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。如果对表的顺序扫描请求非常频繁,可以通过增加该变量值以及内存缓冲区大小来提高其性能。

参数:sort_buffer_size

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

参数:read_rnd_buffer_size

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

参数:record_buffer

每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,可能想要增加该值。

参数:thread_cache_size

保存当前没有与连接关联但是准备为后面新的连接服务的线程,可以快速响应连接的线程请求而无需创建新的。

参数:table_cache

类似于thread_cache _size,但用来缓存表文件,对InnoDB效果不大,主要用于MyISAM。

三、MySQL优化参数实战

考虑到服务器硬件配置和特定应用程序的差异,我们需要根据自己的情况优化配置。

好的做法是,首先使用 MySQL默认值,在 MySQL 服务器稳定运行一段时间后运行,并根据服务器的状态,以及上述的调优参数的知识对其进行优化。

每个连接都需要申请相应的内存,根据默认参数值,每个连接线程使用的最大内存大小为25MB。线程级别参数不应设置得太大。

read_buffer_size:用于顺序读的缓冲区大小,提高顺序读效率,默认131072

read_rnd_buffer_size:用于随机读的缓冲大小,提高随机读效率,默认262144

sort_buffer_size:排序缓冲大小,提高排序效率,默认262144

join_buffer_size:用于普通索引扫描,范围索引扫描和不使用索引并因此执行全表扫描连接的缓冲区的最小值,提高表连接效率,默认262144

binlog_cache_size:二进制日志缓冲大小,用于缓存事务执行期间binlog,提高binlog写入效率,默认32768

tmp_table_size:临时表内存大小,提高临时表存储效率,默认16777216

thread_stack:线程堆栈大小,暂存复杂SQL语句、控制存储过程递归深度等,默认262144

thread_cache_size:线程缓存大小,减少多次打开线程开销,默认8+(max_connections/100),上限100

net_buffer_length:线程池连接缓冲以及读取结果缓冲大小,默认16384

bulk_insert_buffer_size:MyISAM表批量写入数据缓存大小,默认8388608

你可能感兴趣的:(mysql,数据库)