MySQL配置优化(超详细看了就是赚到)

Mysql 参数优化对于不同的网站,及其在线量,访问量,帖子数量,网络情况,以及机器硬件配置都有
关系,优化不可能一次性完成,需要不断的观察以及调试,才有可能得到最佳效果。
下面列出了对性能优化影响较大的主要变量,主要分为连接请求的变量和缓冲区变量。
连接请求的变量
1、max_connections
MySQL 的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,
当然这建立在机器能支撑的情况下,因为如果连接数越多, MySQL会为每个连接提供连接缓冲区,就
会开销越多的内存,所以要适当调整该值,不能盲目提高设值。数值过小会经常出现 ERROR 1040: Too
many connections 错误,可以过mysql> show status like
‘connections’;查看当前状态的连接数量(试图连接到MySQL(不管是否连接成功)的连接数),以定夺该值
的大小。
如果 max_used_connections跟max_connections相同那么就是max_connections 设置过低或者超过
服务器负载上限了,低于10%则设置过大。
如何设置 max_connections?
2、back_log
MySQL 能暂存的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,它就会起作
用。如果MySQL的连接数据达到max_connections 时,新来的请求将会被存在堆栈中,以等待某一连
接释放资源,该堆栈的数量即 back_log,如果等待连接的数量超过back_log,将不被授予连接资源。

#最大连接数
mysql> show variables like ‘%max_connections%’;
±-----------------------±------+
| Variable_name | Value |
±-----------------------±------+
| max_connections | 1024 |
| mysqlx_max_connections | 100 |
±-----------------------±------+
2 rows in set (0.00 sec)
#响应的连接数
mysql> show status like ‘%max_used_connections%’;
±--------------------------±--------------------+
| Variable_name | Value |
±--------------------------±--------------------+
| Max_used_connections | 1 |
| Max_used_connections_time | 2019-10-06 16:14:21 |
±--------------------------±--------------------+
2 rows in set (0.00 sec)

如果 max_used_connections跟max_connections相同那么就是max_connections 设置过低或者超过
服务器负载上限了,低于10%则设置过大。
如何设置 max_connections?
[root@www ~]# vim /etc/my.cnf
[mysqld]
max_connections = 1024

2、back_log
MySQL 能暂存的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,它就会起作
用。如果MySQL的连接数据达到max_connections 时,新来的请求将会被存在堆栈中,以等待某一连
接释放资源,该堆栈的数量即 back_log,如果等待连接的数量超过back_log,将不被授予连接资源。
back_log 值指出在MySQL暂时停止回答新请求之前的短时间内有多少个请求可以被存在堆栈中。只有
如果期望在一个短时间内有很多连接,你需要增加它。
当观察你主机进程列表(mysql> show full processlist),发现大量
xxxxx | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接
进程时,就要加大back_log的值了或加大 max_connections 的值。
mysql> show variables like ‘%back_log%’;
±--------------±------+
| Variable_name | Value |
±--------------±------+
| back_log | 1024 |
±--------------±------+
1 row in set (0.00 sec)
设置方法:
[root@www ~]# vim /etc/my.cnf
[mysqld]
back_log = 1024

3、wait_timeout和interactive_timeout
wait_timeout – 指的是MySQL在关闭一个非交互的连接之前所要等待的秒数
interactive_time --指的是mysql在关闭一个交互的连接之前所要等待的秒数,比如我们在终端上进入
mysql管理,使用的即使交互的连接,这时候,如果没有操作的时间超过了interactive_time设置的时间
就会自动断开。默认数值是 28800,可调优为 7200。
对性能的影响
wait_timeout
如果设置大小,那么连接关闭的很快,从而使一些持久的连接不起作用
如果设置太大,容易造成连接打开时间过长,在 show processlist 时,能看到太多的 sleep
状态的连接,从而造成 too many connections 错误
一般希望 wait_timeout 尽可能地低
interactive_timeout 的设置将要对你的 web application 没有多大的影响
mysql> show variables like ‘%wait_timeout%’;
±-------------------------±---------+
| Variable_name | Value |
±-------------------------±---------+
| innodb_lock_wait_timeout | 50 |
| lock_wait_timeout | 31536000 |
| mysqlx_wait_timeout | 28800 |
| wait_timeout | 28800 |
±-------------------------±---------+
4 rows in set (0.00 sec)
mysql> show variables like ‘%interactive_timeout%’;
±---------------------------±------+
| Variable_name | Value |
±---------------------------±------+
| interactive_timeout | 28800 |
| mysqlx_interactive_timeout | 28800 |
±---------------------------±------+
2 rows in set (0.00 sec)
如何设置
[root@www ~]# vim /etc/my.cnf
[mysqld]
wait_timeout = 7200
interactive_timeout = 7200

缓冲区变量
4、key_buffer_size
key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态
值 Key_read_requests 和 Key_reads,可以知道 key_buffer_size 设置是否合理。比例 key_reads /
key_read_requests应该尽可能的低,至少是1:100,1:1000 更好(上述状态值可以使用 SHOW
STATUS LIKE ‘key_read%’获得)。
mysql> show variables like ‘%key_buffer_size%’;
±----------------±--------+
| Variable_name | Value |
±----------------±--------+
| key_buffer_size | 8388608 |
±----------------±--------+
1 row in set (0.02 sec)
mysql> show status like ‘%key_read%’;
±------------------±------+
| Variable_name | Value |
±------------------±------+
| Key_read_requests | 0 |
| Key_reads | 0 |
±------------------±------+
2 rows in set (0.00 sec)

key_buffer_size 只对 MyISAM 表起作用。即使你不使用 MyISAM 表,但是内部的临时磁盘表是
MyISAM表,也要使用该值。可以使用检查状态值 created_tmp_disk_tables 得知详情。

mysql> show status like ‘%created_tmp%’;
±------------------------±------+
| Variable_name | Value |
±------------------------±------+
| Created_tmp_disk_tables | 0 |
| Created_tmp_files | 6 |
| Created_tmp_tables | 1 |
±------------------------±------+
3 rows in set (0.00 sec)
默认配置数值是 8388608(8M),主机有 4GB 内存,可以调优值为 268435456(256MB)。
修改/etc/my.cnf 文件,在[mysqld]下面添加如下内容
key_buffer_size=268435456 或 key_buffer_size=256M
重启 MySQL Server 进入后,查看设置已经生效。

5、max_connect_errors
是一个 MySQL 中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况,当超过指定次数,MYSQL服务器将禁止host的连接请求,直到mysql服务器重启或通过flush hosts 命令清空此host的相关信息。max_connect_errors 的值与性能并无太大关系。

修改/etc/my.cnf 文件,在[mysqld]下面添加如下内容:
max_connect_errors=20

6、sort_buffer_size
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速 ORDER BY 或 GROUP BY操作。
Sort_Buffer_Size 是一个 connection 级参数,在每个 connection(session)第一次需要使用这个
buffer的时候,一次性分配设置的内存。
Sort_Buffer_Size并不是越大越好,由于是connection级的参数,过大的设置+高并发可能会耗尽系统内存资源。例如:500 个连接将会消耗 500*sort_buffer_size(2M)=1G 内存
mysql> show variables like ‘%sort_buffer_size%’;
±------------------------±--------+
| Variable_name | Value |
±------------------------±--------+
| innodb_sort_buffer_size | 1048576 |
| myisam_sort_buffer_size | 8388608 |
| sort_buffer_size | 262144 |
±------------------------±--------+
3 rows in set (0.01 sec)

设置sort_buffer_size,修改/etc/my.cnf文件,在[mysqld]下面添加如下内容:
sort_buffer_size = 2M

7、max_allowed_packet
MySQL根据配置文件会限制Server接受的数据包大小。有时候大的插入和更新会受
max_allowed_packet参数限制,导致写入或者更新失败。最大值是1GB,必须设置 1024 的倍数。
mysql> show variables like ‘%max_allowed_packet%’;
±--------------------------±-----------+
| Variable_name | Value |
±--------------------------±-----------+
| max_allowed_packet | 67108864 |
| mysqlx_max_allowed_packet | 67108864 |
| slave_max_allowed_packet | 1073741824 |
±--------------------------±-----------+
3 rows in set (0.00 sec)

8、join_buffer_size
用于表间关联缓存的大小,和sort_buffer_size一样,该参数对应的分配内存也是每个连接独享。
mysql> show variables like ‘%join_buffer_size%’;
±-----------------±-------+
| Variable_name | Value |
±-----------------±-------+
| join_buffer_size | 262144 |
±-----------------±-------+
1 row in set (0.00 sec)

9、thread_cache_size
服务器线程缓存,这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时,那么客户端的线程
将被放到缓存中以响应下一个客户而不是销毁(前提是缓存数未达上限),如果线程重新被请求,那么请求
将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线
程,增加这个值可以改善系统性能。
mysql> show variables like ‘%thread_cache_size%’;
±------------------±------+
| Variable_name | Value |
±------------------±------+
| thread_cache_size | 18 |
±------------------±------+
1 row in set (0.00 sec)
通过比较 Connections和Threads_created状态的变量,可以看到这个变量的作用。设置规则如下:
1GB 内存配置为 8,2GB 配置为 16,3GB 配置为 32,4GB 或更高内存,可配置更大。
mysql> show status like ‘connections’;
±--------------±------+
| Variable_name | Value |
±--------------±------+
| Connections | 8 |
±--------------±------+
1 row in set (0.00 sec)
mysql> show status like ‘threads_%’;
±------------------±------+
| Variable_name | Value |
±------------------±------+
| Threads_cached | 0 |
| Threads_connected | 1 |
| Threads_created | 1 |
| Threads_running | 2 |
±------------------±------+
4 rows in set (0.00 sec)

Threads_cached :代表当前此时此刻线程缓存中有多少空闲线程。
Threads_connected :代表当前已建立连接的数量,因为一个连接就需要一个线程,所以也可以看成当前被使用的线程数。
Threads_created :代表从最近一次服务启动,已创建线程的数量,如果发现 Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size 值。
Threads_running :代表当前激活的(非睡眠状态)线程数。并不是代表正在使用的线程数,有时候连接已建立,但是连接处于sleep状态。

配置InnoDB的几个变量
10、innodb_buffer_pool_size
对于 InnoDB 表来说,innodb_buffer_pool_size 的作用就相当于 key_buffer_size对于MyISAM表的作
用一样。InnoDB使用该参数指定大小的内存来缓冲数据和索引。对于单独的MySQL数据库服务器,最
大可以把该值设置成物理内存的 80%。根据 MySQL 手册,对于 2G 内存的机器,推荐值是
1G(50%)。如果你的数据量不大,并且不会暴增,那么无需把 innodb_buffer_pool_size 设置的太大
了。
mysql> show variables like ‘%innodb_buffer_pool_size%’;
±------------------------±-----------+
| Variable_name | Value |
±------------------------±-----------+
| innodb_buffer_pool_size | 2147483648 |
±------------------------±-----------+
1 row in set (0.00 sec)
设置 innodb_buffer_pool_size,修改/etc/my.cnf文件,在[mysqld]下面添加如下内容:
innodb_buffer_pool_size = 2048M

11、innodb_flush_log_at_trx_commit
主要控制了InnoDB将 log buffer 中的数据写入日志文件并 flush 磁盘的时间点,取值分别为0、1、2三
个。
0,表示当事务提交时,不做日志写入操作,而是每秒钟将 log buffer 中的数据写入日志文件并flush磁盘一次;
1,则在每秒钟或是每次事物的提交都会引起日志文件写入、flush 磁盘的操作,确保了事务的 ACID;
2,每次事务提交引起写入日志文件的动作,但每秒钟完成一次 flush 磁盘操作。
实际测试发现,该值对插入数据的速度影响非常大,设置为 2 时插入10000条记录只需要2秒,设置为0
时只需要1秒,而设置为1时则需要 229 秒。因此,MySQL 手册也建议尽量
将插入操作合并成一个事务,这样可以大幅提高速度。
根据 MySQL 手册,在允许丢失最近部分事务的危险的前提下,可以把该值设为 0 或 2。
mysql> show variables like ‘%innodb_flush_log_at_trx_commit%’;
±-------------------------------±------+
| Variable_name | Value |
±-------------------------------±------+
| innodb_flush_log_at_trx_commit | 1 |
±-------------------------------±------+
1 row in set (0.00 sec)

12、innodb_thread_concurrency
此参数用来设置 innodb 线程的并发数量,默认值为 0 表示不限制,若要设置则与服务器的CPU 核数相
同或是cpu的核数的 2 倍,建议用默认设置,一般为 8。
mysql> show variables like ‘%innodb_thread_con%’;
±--------------------------±------+
| Variable_name | Value |
±--------------------------±------+
| innodb_thread_concurrency | 0 |
±--------------------------±------+
1 row in set (0.00 sec)

13、innodb_log_buffer_size
此参数确定些日志文件所用的内存大小。缓冲区更大能提高性能,对于较大的事务,可以增大缓存大
小。
mysql> show variables like ‘%innodb_log_buffer_size%’;
±-----------------------±---------+
| Variable_name | Value |
±-----------------------±---------+
| innodb_log_buffer_size | 16777216 |
±-----------------------±---------+
1 row in set (0.00 sec)

14、innodb_log_file_size
此参数确定数据日志文件的大小,更大的设置可以提高性能。
mysql> show variables like ‘%innodb_log_file_size%’;
±---------------------±---------+
| Variable_name | Value |
±---------------------±---------+
| innodb_log_file_size | 50331648 |
±---------------------±---------+
1 row in set (0.00 sec)

15、innodb_log_files_in_group
为提高性能,MySQL可以以循环方式将日志文件写到多个文件。推荐设置为 3。
mysql> show variables like ‘%innodb_log_files_in_group%’;
±--------------------------±------+
| Variable_name | Value |
±--------------------------±------+
| innodb_log_files_in_group | 2 |
±--------------------------±------+
1 row in set (0.00 sec)

16、read_buffer_size
MySql 读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql 会为它分配一段内存
缓冲区。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值
以及内存缓冲区大小提高其性能。和 sort_buffer_size 一样,该参数对应的分配内存也是每个连接独
享。
mysql> show variables like ‘%read_buffer_size%’;
±-----------------±-------+
| Variable_name | Value |
±-----------------±-------+
| read_buffer_size | 131072 |
±-----------------±-------+
1 row in set (0.00 sec)

17、read_rnd_buffer_size
MySql 的随机读(查询操作)缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个
随机读缓存区。进行排序查询时,MySql 会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如
果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该缓冲空间,所以应尽量适当
设置该值,以避免内存开销过大。
注:顺序读是指根据索引的叶节点数据就能顺序地读取所需要的行数据。随机读是指一般需要根据辅助
索引叶节点中的主键寻找实际行数据,而辅助索引和主键所在的数据段不同,因此访问方式是随机的。
mysql> show variables like ‘%read_rnd_buffer_size%’;
±---------------------±-------+
| Variable_name | Value |
±---------------------±-------+
| read_rnd_buffer_size | 262144 |
±---------------------±-------+
1 row in set (0.00 sec)

18、bulk_insert_buffer_size
批量插入数据缓存大小,可以有效提高插入效率,默认为 8M
mysql> show variables like ‘%bulk_insert_buffer_size%’;
±------------------------±--------+
| Variable_name | Value |
±------------------------±--------+
| bulk_insert_buffer_size | 8388608 |
±------------------------±--------+
1 row in set (0.01 sec)

19、binlog相关参数
mysql> show variables like ‘log_bin%’;
±--------------------------------±----------------------------------+
| Variable_name | Value |
±--------------------------------±----------------------------------+
| log_bin | ON |
| log_bin_basename | /data/mysql/binlogs/server1 |
| log_bin_index | /data/mysql/binlogs/server1.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
±--------------------------------±----------------------------------+
5 rows in set (0.00 sec)

binlog_cache_size: 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存,提高记录bin-log的效率。没有什么大事务,DML也不是很频繁的情况下可以设置小一点,如果事务大而且多,DML操作也频繁,则可以适当的调大一点。前者建议是1M,后者建议是:2-4M;
max_binlog_cache_size: 表示的是 binlog 能够使用的最大 cache 内存大小;
max_binlog_size: 指定binlog日志文件的大小,如果当前的日志大小达到max_binlog_size,还会自动创建新的二进制日志。你不能将该变量设置为大于 1GB 或小于4096 字节。默认值是1GB。在导入大容量的sql文件时,建议关闭 sql_log_bin,否则硬盘扛不住,而且建议定期做删除。
expire_logs_days: 定义了mysql清除过期日志的时间。二进制日志自动删除的天数。默认值为 0,
表示“没有自动删除”。mysqladmin flush-logs 也可以重新开始新的binary log。

相关优化参数总结:
[mysqld]
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/data/slow-query.log
long_query_time = 1
log-queries-not-using-indexes
max_connections = 1024
back_log = 128
wait_timeout = 60
interactive_timeout = 7200
key_buffer_size=256M
max_connect_errors=20
sort_buffer_size = 2M
max_allowed_packet=32M
join_buffer_size=2M
thread_cache_size=200
innodb_buffer_pool_size = 2048M
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size=32M
innodb_log_file_size=128M
innodb_log_files_in_group=3
log-bin=mysql-bin
binlog_cache_size=2M
max_binlog_cache_size=8M
max_binlog_size=512M
expire_logs_days=7
read_buffer_size=1M
read_rnd_buffer_size=16M
bulk_insert_buffer_size=64M
log-error = /usr/local/mysql/data/mysqld.err

优化总结
基本思路如下:
性能瓶颈定位
show 命令
可以通过 show 命令查看 MySQL 状态及变量,找到系统的瓶颈:
查看 MySQL服务器配置信息mysql> show variables;
查看 MySQL服务器运行的各种状态值 mysql> show global status;
mysqladmin variables -u username -ppassword——显示系统变量
mysqladmin extended-status -u username -ppassword——显示状态信息
慢查询日志
explain 分析查询
profiling 分析查询
索引及查询优化
配置优化
MySQL 数据库是常见的两个瓶颈是CPU和I/O的瓶颈,CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候。磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应用分布在网络上,那么查询量相当大的时候那么平瓶颈就会出现在网络上,我们可以用mpstat, iostat, sar 和 vmstat 来查看系统的性能状态。
除了服务器硬件的性能瓶颈,对于MySQL系统本身,我们可以使用工具来优化数据库的性能,通常有三种:使用索引,使用EXPLAIN分析查询以及调整MySQL的内部配置。

猜你喜欢

转载自blog.csdn.net/wangboyujiayou/article/details/106397632