MySQL 性能优化实战,MySQL 性能调优和系统资源优化解决方案(二)

 

目录

前言

服务器优化

八、服务器优化

1、优化服务器硬件

2、优化 MySQL的参数

 九、MySQL 中的配置参数详解

1)、MySQL 的基础配置参数

2)、MySQL 查询缓存配置参数

3)、MySQL 中 InnoDB 存储引擎的配置参数

4)、MySQL 中 MyISAM 存储引擎的配置参数

5)、MySQL 日志配置参数

6)、MySQL 连接通信参数配置

7)、MySQL 的Buffer缓冲区参数设置

8)、MySQL 性能优化的其它配置参数

十、MySQL 数据库运行状态检查

1)、常用的状态监控参数

2)、其它补充参数


前言

在上第一部分文章中《 MySQL 性能优化实战,MySQL 性能调优和系统资源优化解决方案(一) 》完成了MySQL数据库的结构优化、性能调优,接下来这部分主讲系统资源调优、通过MySQL的系统配置参数实现。

服务器优化

 

八、服务器优化

1、优化服务器硬件

服务器的硬件性能直接决定着 MySQL数据库的性能,硬件的性能瓶颈,直接决定 MySQL数据库的运行速度和效率。

 

硬件服务器的优化需要从以下几个方面考虑:

  1. 配置较大的内存,足够大的内存,是提高 MySQL数据库性能的方法之一。内存的 IO比硬盘快的多,可以增加系统的缓冲区容量,使数据在内存停留的时间更长,以减少磁盘的 IO;
  2. 配置高速磁盘,比如 SSD;
  3. 合理分配磁盘 IO,把磁盘 IO分散到多个设备上,以减少资源的竞争,提高并行操作能力;
  4. 配置多核处理器,MySQL 是多线程的数据库,多处理器可以提高同时执行多个线程的能力;

 

2、优化 MySQL的参数

通过优化 MySQL的参数可以提高资源利用率,从而达到提高MySQL服务器性能的目的。在 MySQL交互模式下的命令:“ SHOW  VARIABLES ”,如下图:

MySQL 性能优化实战,MySQL 性能调优和系统资源优化解决方案(二)_第1张图片

MySQL 的配置参数都在 my.cnf或者 my.ini文件的 [mysqld] 组中,配置示例如下:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[mysqld]
lower_case_table_names = 1
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

 

 九、MySQL 中的配置参数详解

1)、MySQL 的基础配置参数

参数名

说明

user

用户名

bind-address

绑定IP地址

port

端口号

datadir

数据文件存放目录

basedir

MySQL 应用程序存放目录

socket

socket 文件存放目录文件

default-table-type

配置系统默认引擎

 

2)、MySQL 查询缓存配置参数

参数名

说明

query_cache_size

配置 MySQL的查询缓存大小,

缓存大小的直接因素:

1、对DDL和DML语句的性能影响;
2、内部维护成本;
3、命中率及内存使用率;
4、项目/产品的业务类型;

query_cache_type

查询缓存类型。取值如下:

0 OFF,禁用查询缓存功能;
1 ON,启用缓存的功能,缓存所有符合要求的查询结果集,除SELECT SQL_NO_CACHE ...,以及不符合查询缓存设置的结果集外;
2 DEMAND,仅仅缓存SELECT SQL_CACHE ...子句的查询结果集,除不符合查询缓存设置的结果集外;

query_cache_limit

查询结果长度的长度限制,小于这个长度的数据才能被缓存

 

3)、MySQL 中 InnoDB 存储引擎的配置参数

InnoDB 参数较少,内存的管理多由 InnoDB引擎自己负责,主要配置参数为“innodb_buffer_pool_size”,参数分配的缓冲。

参数名

说明

innodb_buffer_pool_size

新开辟一片内存用于缓存 InnoDB引擎表的数据和索引,一般设置为机器内存的50%-80%(关键参数)
该参数的最大值受限于服务器本身 CPU的架构,支持32位还是支持64位,另外还受限于操作系统32位还是64位;
合理设值 innodb_buffer_pool_size,有利于节约访问表对象中数据的物理IO。在官方手册上建议专用的数据库服务器,考虑设置为物理内存总量的80%。除了物理服务器的物理内存总量外,还需要考虑整个数据库中是否只使用 InnoDB引擎、mysqld内部管理占用的内存、最大线程连接数和临时表等额外的因素,官方提供的 80%仅作为一个参考。
在以下四种情况中,需要考虑降低 innodb_buffer_pool_size的设值:
1、出现物理内存的竞争,可能导致操作系统的分页;
2、InnoDB预分配额外的内存给缓冲区和结构管理,当分配的总内存量超过 innodb_buffer_pool_size值的10%;
3、地址内存空间要求必须为连续的,在windows系统有一个严重问题,DLL需要加载在特定的地址空间内;
4、初始化缓冲区的时间消耗,与缓冲区的大小成正比;

innodb_log_buffer_size

InnoDB 日志缓冲区大小

innodb_flush_method

刷新日志的方法

innodb_additional_mem_pool_size

开辟一片内存用于缓存 InnoDB引擎的数据字典信息和内部数据结构(比如:自适应HASH索引结构),默认值:build-in版本默认值为:1M;Plugin-innodb版本默认值为:8M;

注:若是 mysqld服务上的表对象数量较多,InnoDB引擎数据量很大,且 innodb_buffer_pool_size的值设置较大,则应该适当地调整 innodb_additional_mem_pool_size的值。若是出现缓存区的内存不足,则会直接向操作系统申请内存分配,并且会向 MySQL的 error日志文件写入警告信息;

innodb_data_home_dir

InnoDB 数据文件的目录

innodb_data_file_path

数据文件配置

innodb_log_files_in_group

InnoDB 日志的

innodb_log_file_size

指定 InnoDB 日志文件的大小

innodb_lock_wait_timeout

等待锁的超时时间,避免死锁

innodb_flush_log_at_trx_commit

日志提交方式 (关键参数)

0,每秒写1次日志,将数据刷入磁盘,相当于每秒提交一次事务;

1,每次提交事务写日志,同时刷新相应磁盘 -> 默认参数;

2,每提交事务写一次日志,但每隔一秒刷新一次相应的磁盘文件;

innodb_force_recovery

在 InnoDB 的自动恢复失败后,从崩溃中强制启动,有1-6个级别,数值越低恢复的方式也保守,默认为4。尽量使用较保守方式恢复。恢复后要注释删除这一行。

 

4)、MySQL 中 MyISAM 存储引擎的配置参数

参数名

说明

key_buffer_size

索引块用的缓冲区大小,所有的连接程序线程共用(关键参数)

key_buffer_size只缓存MyISAM或MyISAM引擎的索引数据,而 innodb_buffer_pool_size不仅能缓存索引数据,还能缓存元数据,但是对于只使用 InnoDB引擎的数据库而言,此参数值也不能设置过于偏小,因为临时表可能会使用到此缓存空间,推荐大小:64M。

key_cache_block_size

每一个索引 Block 的大小,默认 1024 字节,从4.1.1后才出现这个参数,原来都是直接采用 1024 字节作为 Block 的长度

 

5)、MySQL 日志配置参数

MySQL中日志是监控数据库系统的重要途径。MySQL的日志分为6种:查询日志、慢查询日志、变更日志、二进制变更日志、告警日志、错误日志。

参数名

说明

log

查询日志,记录所有的 MySQL的命令操作,在跟踪数据库运行时非常有帮助

log-slow-queries

慢查询日志

log-update

变更日志,用文本方式记录所有改变数据的变更操作

log-bin

二进制变更日志,更加紧凑,使用mysqlbinlog读取,操作,转换

log-warnings

告警日志

log-error

错误日志

binlog_cache_size

临时存放某次事务的 SQL语句缓冲长度

max_binlog_cache_szie

最大的二进制缓存日志缓冲区大小

max_binlog_size

最大的二进制日志大小

long_query_time

慢查询时间限度,超过这个限度,MySQL 将认为是一个慢查询,并记录到慢查询日志中

log-queries-not-using-indexes

没有使用索引查询的日志,方便记录长时间访问的查询进行优化

 

6)、MySQL 连接通信参数配置

参数名

说明

max_connections

MySQL 的最大连接数,该值一般情况下都会设值在128-1024的范围,再结合实际业务可能的最大事务并发度。

max_connect_errors

同一个连接地址最大错误连接数,防止恶意攻击,默认值为10,也即 mysqld线程没重新启动过,一台物理服务器只要连接异常中断累计超过10次,就再也无法连接上 mysqld服务;若异常中断累计超过参数设置的值,有两种解决方案,执行命令:FLUSH HOSTS 或者重新启动 mysqld服务。

net_buffer_length

服务器和客户端之间通讯,使用的缓冲区长度,单位:字节

max_allowed_packet

服务器和客户端之间最大的通信缓冲区长度,单位:字节

net_read_timeout

读取超时

net_write_timeout

写入超时

interactive_timeout

交互模式下,没有操作后的超时时间,单位:秒

wait_ timeout

非交互模式,没有操作后的超时时间,此参数只对基于 TCP/IP或基于 Socket通信协议建立的连接才有效,单位:秒

 

7)、MySQL 的Buffer缓冲区参数设置

在前面一篇文章MySQL的MyCat中间件《 Mycat中的两个主要Buffer池,BufferPool的二级缓存 》中介绍到了Buffer 池的概念,以及其设值的规则,和这儿的 Buffer 类似,但又不同。

参数名

说明

read_buffer_size

读取缓冲区大小

write_buffer_size

写入缓冲区大小,MyISAM 特有的

read_rnd_buffer_size

在经过排序后,读取的结果集数据缓冲区大小

sort_buffer_size

数据排序的缓冲区大小

join_buffer_size

关联操作缓冲区大小

myisam_sort_buffer_szie

为索引的重新排序操作分配的缓冲区的大小

 

8)、MySQL 性能优化的其它配置参数

关闭某些系统项,可以加快 MySQL的运行速度

参数名

说明

skip-openssl

关闭 MySQL服务器对SSL加密的支持

skip-isam

关闭 MySQL服务器对 ISAM引擎的支持

skip-bdb

关闭 MySQL服务器对 BDB引擎的支持

skip-external-locking

关闭外部锁,MySQL的外部锁用于防止其他程序修改正在使用的数据文件,但在部分系统上不可靠,一般都不使用。

skip-innodb

关闭 MySQL服务器对 InnoDB引擎的支持

skip_networking

关闭 MySQL服务器的远程访问,只能从本地访问数据库

 

MySQL 磁盘写操作的优化参数:

delay_key_write、flush、flush_time配置参数,可以进一步提高 MyISAM引擎的性能,但在服务器宕机的时候,可能会导致业务数据丢失或数据表损坏的情况。

delay_insert_limit、delay_insert_timeout配置参数,在 MySQL中对于插入语句控制,如果有配置此参数,MySQL 会将新进的插入语句放入到一个队列中,而不是不马上读入到磁盘。

delay_key_write配置参数,在 MySQL创建表的时候,如果表的主键发生改动,改动会缓冲在 key_buffer中,而不是立即回写到磁盘。

参数名

说明

delay_insert_limit

INSERT DELAYED 语句选项。(插入语句的描述)

处理INSERT DELAYED语句,MYSQL插入delay_insert_limit条语句后检查是否有查询语句,如有有去查询,如果没有,则继续插入

delay_insert_timeout

在处理完INSERT DELAYED对列的插入数据后,MYSQL等待delay_insert_timeout秒后看看是否有INSERT DELAYED数据,如果有继续,如果没有结束这次操作。

delay_query_size

INSERT DELAYED插入数据对列的长度

max_delayed_threads

处理INSERT DELAYED语句的最大线程个数

delay_key_write

对于使用DELAY_KEY_WRITE选项的创建的表,可以延缓键读写

0N  不延缓所有的键写如操作

OFF延缓有DELAY_KEY_WRITE选项的标的键写入操作

ALL延缓所有的表

flush

是否要在每个操作后立即刷新数据表

flush_time

每隔多少秒,对数据表进行一次刷新。关闭后打开。

 

十、MySQL 数据库运行状态检查

通过命令 “ SHOW STATUS ” 进行查看,通过观察其状态来判断当前数据库中的表或者数据是否需要优化。例如,当前我们最常用的数据库引擎是InnoDB,观察其运行情况可入输入命令 “ SHOW STATUS WHERE variable_name LIKE '%INNODB%'; ”,如下图:

MySQL 性能优化实战,MySQL 性能调优和系统资源优化解决方案(二)_第2张图片

通过观察可以看到,MySQL数据库运行状态大多为类似于计数器的模式进行记录的,可以通过 “ FLUSH STATUS ” 命令将所有运行状态进行重置。

 

1)、常用的状态监控参数

参数名

说明

Aborted_clients

因客户没有正确关闭而丢弃的连接数量,没有正确关闭指没有调用mysql_close就退出,连接超时,数据传送中客户端退出

Aborted_connects

试图连接MySQL服务器但没有成功的次数

Bytes_received

从客户收到的字节总数

Bytes_send

发送给客户的字节总数

Com_XXX

执行语句的计数器,比如Com_select变量记录了select语句的个数

Connections

试图连接MySQL服务器的尝试次数,(包括成功的和没有成功)

Created_tmp_disk_tables

使用磁盘创建临时表的次数,如果要创建的临时表的尺寸大于tmp_table_size,那么临时表将创建在磁盘上,

Created_tmp_tables

创建临时表的次数

Delayed_XXX

INSERT DELAYED语句的执行性能参数

Handler_commit

Handler_rollback

事务提交或者回滚的次数

Handler_delete

对数据表删除一条记录的次数

Handler_update

对数据表修改一条记录的次数

Handler_write

对数据表插入一条记录的次数

Handler_read_first

读取索引中第一个索引项的个数

Handler_read_key

根据索引直接读取一行数据的次数,这个数值高表示数据库有较好的检索能力。

Handler_read_next

根据索引读取下个数据行的请求次数. 在一个索引的区间内进行查询( > < ,orderby 这类查询条件)会影响这个计数器。

Handler_read_prev

根据索引读取前个数据行的请求次数.用于一些反序查询。

Handler_read_rnd

通过一个固定位置(应该就是不通过索引)读取一个数据行的次数。这个数值很高表示你的很多查询操作的结果需要排序,可能这些查询操作不能适当使用索引而要检索整个表。

Handler_read_rnd_next

请求从数据文件中读取下一个记录的次数.如果有很多全表的检索这个值将很高. 通常这表示数据表没有合适的索引。

key_blocks_used

索引缓冲区块中已经被使用的区块大小。Block的尺寸默认是1024字节,4.1.1后可以通过key_cache_block_size参数设置。可以根据key_buffer_size/(1024 or key_cache_block_size) 得到Block总数,然后知道key_buffer的利用率

Key_read_requests

从缓冲读取1个Block的次数

Key_read

从磁盘读取的次数

Key_write_requests

写入索引缓冲区写入一个Block的次数

Key_write

写回磁盘的次数

Innodb_XXXX

InnoDB的状态技术器,不过只有MySQL 5.02的版本才支持这些计数器。这儿略过

Opened_tables

曾经打开过的数据表总数

Open_tables

当前处于打开的表个数

Open_files

当前处于打开的文件个数

Qcache_free_blocks

Qcache没有使用的内存块个数

Qcache_free_memory

Qcache没有使用的内存尺寸

Qcache_hits

查询在Qcache中的命中次数,和Com_select比较,就可以知道Qache的大约命中率是多少。

Qcache_inserts

加入Cache中的查询个数

Qcache_lowmem_prunes

由于Qcache不够用,造成替换出Qcache的查询个数

Qcache_not_cached

没有能Cache的查询个数

Slow_queries

慢查询的次数,如果一个查询的所用的时间大于long_query_time设置的时间,则计数加1

Select_XXXX

关联查询的一些状态计数

Table_locks_waited

必须等待后才能完成表锁定的请求个数,如果这个数值和下面数值的比率过大,表示数据库的性能较低

Table_locks_immediate

无需等待,立即完成表锁定的请求个数。

Thread_connected

现在处在连接打开状态的线程个数

Thread_cached

现在在现场缓冲区的线程个数

Thread_created

到目前为止,创建的线程个数

Thead_running

现在运行的线程个数,不是所有打开的线程都在运行,有些会处于SLEEP状态

 

2)、其它补充参数

参数名 说明
sync_binlog

日志提交方式(关键参数):

大于0,每次向二进制日志文件写入N条SQL或N个事务后,则把二进制日志文件的数据刷新到磁盘上;
等于0,不主动刷新二进制日志文件的数据到磁盘上,而是由操作系统来决定;

和 innodb_flush_log_at_trx_commit 配置使用(最佳推荐):
1,1,适合数据安全性要求非常高,而且磁盘IO写能力足够支持业务,比如充值消费系统;
1,0,适合数据安全性要求高,磁盘IO写能力支持业务不富余,允许备库落后或无复制;
2,0/2,y(0 0,0,磁盘IO写能力有限,无复制或允许复制延迟稍微长点能接受;
注:x,y,x表示innodb_flush_log_at_trx_commit,y表示sync_binlog

innodb_file_per_table 启用单表空间,减少共享表空间维护成本,减少空闲磁盘空间释放的压力。另外,在数据量较大情况下的性能也会有提升,为此,一般建议使用独立表空间代替共享表空间的方式。
innodb_commit_concurrency

同一时刻,允许多少个线程同时提交InnoDB事务,默认值为0,范围0-1000。取值定义:

0,允许任意数量的事务在同一时间点提交;
大于0,允许指定个数事务在同一时间点提交;

innodb_concurrency_tickets 同一时刻,能访问 InnoDB引擎数据的线程数,默认值为500,取值范围1-4294967295。如果,当访问 InnoDB引擎数据的线程数达到设值的上线,线程将会被放到队列中,等待其他线程释放 tickets后再进入,一般情况下保持默认即可够用了。
innodb_fast_shutdown

InnoDB引擎关闭的方式,默认值为:1,表示正常关闭的,取值:

0,mysqld服务关闭前,先进行数据完全的清理和插入缓冲区的合并操作,若是脏数据较多或者服务器性能等因素,会导致此过程需要数分钟或者更长时间;
1,正常关闭mysqld服务,当 InnoDB引擎不做任何其他的操作;
2,若是 mysqld出现崩溃,立即刷事务日志到磁盘上并且冷关闭mysqld服务;没有提交的事务将会丢失,但是当再启动 mysqld服务的时候会进行事务回滚恢复;
 

innodb_force_recovery

mysqld服务出现崩溃之后,InnoDB引擎进行回滚的模式,默认值为0。只有在需要从错误状态的数据库进行数据备份时,才会设值 innodb_force_recovery,若是把此参数作为安全选项,也可以把参数的值设置大于0,防止 InnoDB引擎的数据变更,取值:
0,正常的关闭和启动,不会做任何强迫恢复操作;
1,跳过错误项目,让 mysqld服务继续运行。跳过错误索引记录和存储,尝试通过SELECT * INOT OUTFILE ‘../filename’ FROM tablename 方式,完成数据备份;
2,阻止 InnoDB的主线程运行。清理操作时出现 mysqld服务崩溃,则会阻止数据恢复操作;
3,恢复的时候,不进行事务回滚;
4,阻止 INSERT缓冲区的合并操作。不做合并操作,为防止出现 mysqld服务崩溃。不计算表的统计信息;
5,mysqld 服务启动的时候不检查回滚日志,InnoDB引擎对待每个不确定的事务就像提交的事务一样;
6,不做事务日志前滚恢复操作;

 

推荐组合配置:
innodb_fast_shutdown = 1
mysqld服务关闭前,先进行数据完全的清理和插入缓冲区的合并操作,若是脏数据较多或者服务器性能等因素,会导致此过程需要数分钟或者更长时间,若是机房条件较好可设置为0(例如:双路电源、UPS、RAID卡电池和供电系统稳定性)
innodb_force_recovery = 0
正常的关闭和启动,不会做任何强迫恢复操作

lower_case_table_names 在Linux或Unix中,对文件名称大小写敏感,也即对数据库、表、存储过程等对象名称大小写敏感,为减少开发人员的开发成本,推荐设值该参数,值为1,表示所有对象名称都统一的自动转换成小写(重要参数)
transaction-isolation 事务隔离级别,隔离级别包括:read-uncommitted、read-committed、repeatable-read、serializable,默认值为:repeatable-read,有关事务隔离级别设值详情可参考MySQL事务隔离级别和日志登记模式的选择。
binlog-format

复制的模式,可供设置的值:statement、row、mixed(注:5.0.x 只有 statement,5.1.x 版本默认设置:mixed),组合配置推荐:
1、只读为主的业务应用场景
transaction-isolation =  read-committed
binlog-format  = mixed
2、非只读的业务应用场景
transaction-isolation = repeatabled-read
binlog-format  = mixed

event_scheduler 事务调度,事务调度默认是关闭状态,可以临时打开,命令:SET GLOBAL event_scheduler=1;
skip_external_locking 外部锁,也即操作系统实施的锁,仅 MyISAM引擎有效,且容易造成死锁发生,所以一律禁用
innodb_adaptive_hash_index InnoDB 引擎会根据数据的访问频繁度,把表的数据逐渐缓到内存,若是一张表的数据大量缓存在内存中,则使用Hash Index(散列索引)会更高效。InnoDB 内有Hash Index机制,监控数据的访问情况,可以自动创建和维护一个Hash Index,以提高访问效率,减少内存的使用。
innodb_max_dirty_pages_pct InnoDB 主线程会直接更新 innodb_buffer_pool_size中存在的数据,并且不会实时刷回到磁盘,而是等待相关的事件发生,许缓存空间的数据量不实时刷回磁盘的最大百分比。比例设置较小,有利于 减少 mysqld服务出现问题的时候恢复时间,缺点则是需要更多的物理IO,所以,需要根据业务特点和可承受范围内进行一个折中。

 

 

 

参考文档:

MySQL中文官网:【MySQL 性能调优和优化资源】


 好了,关于 MySQL 性能优化实战,MySQL 性能调优和系统资源优化解决方案(二) 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者: 华    仔
联系作者: [email protected]
来        源: CSDN (Chinese Software Developer Network)
原        文: https://blog.csdn.net/Hello_World_QWP/article/details/105731579
版权声明: 本文为博主原创文章,请在转载时务必注明博文出处!

你可能感兴趣的:(MySQL)