Mysql配置优化

my.cnf路径

找到mysql的my.cnf文件mysql

命令:which mysqldsql

找到mysqld以后命令:/usr/sbin/mysqld --verbose --help |grep -A 1 'Default options'数据库

my.cnf配置

back_log = 300

查看当前mysql默认back_log值:show variables like 'back_log';缓存

该参数表示当MySQL的链接数达到max_connections时会将进来的请求短期存储在堆栈中,以等待某一个链接释放。堆栈中请求的最大数量就是back_log的值。若是等待链接的数量超过back_log,将不被授予链接资源。安全

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

character-set-server=utf8mb4

utf-8编码可能2个字节、3个字节、4个字节的字符,可是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符。若是直接往采用utf-8编码的数据库中插入表情数据,Java程序中将报SQL异常utf8mb4编码是utf8编码的超集,兼容utf8,而且能存储4字节的表情字符。 采用utf8mb4编码的好处是,存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。tcp

slow_query_log = ON
slow_query_log_file = /usr/local/mysql/data/slow.log
long_query_time = 1

slow_query_log 慢查询开启状态
slow_query_log_file 慢查询日志存放的位置(这个目录须要MySQL的运行账号的可写权限,通常设置为MySQL的数据存放目录)
long_query_time 查询超过多少秒才记录到慢查询日志里面。函数

server-id=1
log-bin=/databack/data_logbin/mysql_binlog

server-id表示当前服务器Id,若是集群方式该值不能重复。性能

log-bin表示二进制文件存放路径。大数据

innodb_log_file_size=2G

该参数决定着mysql事务日志文件(ib_logfile0)的大小.

在高写入负载尤为是大数据集的状况下很重要。这个值越大则性能相对越高,跟据服务器大小而异。这是redo日志的大小。redo日志被用于确保写操做快速而可靠而且在崩溃时恢复。在MySQL 5.5,redo日志的总尺寸被限定在4GB(默承认以有2个log文件)。而MySQL 5.6里能够设置容许大于4G。你能够一开始就把它设置成4G。这个值的设置实际上是能够计算的 你能够经过命令SHOW GLOBAL STATUS的输出看Innodb_os_log_written的值,把该值除以1024*1024 获得的结果是每分钟处理的redo日志大小,而后再乘以60获得每小时处理的日志大小,由于在5.5以上版本都是默认有两个日志重作日志文件ib_logfile0和ib_logfile1,所获得结果再除以2,再取整就是你的redo该设置大小了。

当一个日志文件写满后,innodb会自动切换到另一个日志文件,并且会触发数据库的检查点(Checkpoint),这会致使innodb缓存脏页的小批量刷新,会明显下降innodb的性能。因为日志切换更频繁,也就直接致使更多的BUFFER FLUSH,因为日志切换的时候是不能BUFFER FLUSH的, BUFFER写不下去,致使没有多余的buffer 写redo, 那么整个MYSQL就HANG住,还有一种状况是若是有一个大的事务,把全部的日志文件写满了,尚未写完,这样就会致使日志不能切换(由于实例恢复还须要,不能被循环复写)这样mysql就hang住了。能够根据文件修改时间来判断日志文件的旋转频率,旋转频率太频繁,说明日志文件过小了。

innodb_log_buffer_size=4M

该参数确保有足够大的日志缓冲区来保存脏数据在被写入到日志文件以前存储在内存中。

默认为1M,在默认的设置在中等强度写入负载以及较短事务的状况下,服务器性能还能够。若是存在更新操做峰值或者负载较大,就应该考虑加大它的值了。在 InnoDB在事务提交前,并不将改变的日志写入到磁盘中,所以在大事务中,能够减轻磁盘I/O的压力。一般状况下,若是不是写入大量的超大二进制数据,4MB-8MB已经足够了。

innodb_buffer_pool_size=4G

这配置对Innodb表来讲很是重要。该参数主要做用是缓存innodb表的索引,数据,插入数据时的缓冲因为Innodb把数据和索引都缓存起来,所以在配置该参数时,能够设置它高达60-80% 的可用内存(官网是建议的也是系统内存的80%左右)。缓冲池是数据和索引缓存的地方这能保证你在大多数的读取操做时使用的是内存而不是硬盘。通常配置的值是5-6GB(8GB内存),19-25GB(32GB内存),38-50GB(64GB内存)仅供参考。

innodb_flush_logs_at_trx_commit=2

innodb_flush_log_at_trx_commit设置为1时,每次commit时都会将事务日志刷到磁盘上,io操做频繁性能低下,绝对安全不会丢失事务;innodb_flush_log_at_trx_commit设置为0时,每次commit时都会将事务日志写入innodb log buffer ,而后每秒Log Thread 会将事务日志从innodb log buffer刷新到ib_ogfile(也就刷新到了磁盘)。因此mysqld进程的崩溃时,innodb log buffer可能会有一秒的日志没有刷新出来,可是在这种状况下,MySQL性能最好;

innodb_flush_log_at_trx_commit设置为2时,每次commit时都会将事务日志写入到innodb log buffer同时也会写入到os cache,而后每秒从os cache刷新到ib_logfile(也就是刷新到了磁盘)。只有在操做系统崩溃时才会丢失事务。

join_buffer_size = 4M

只有当sql语句explain的结果type为ALL,index,rang或者Index_merge的时候使用的buffer。实际上参与join的每个表都须要一个join buffer。须要注意的是,每个线程都会建立本身独立的buffer而不是整个系统共享,因此设置的值过大会形成系统内存不足。

若是应用中,不多出现join语句,则能够不用太在意join_buffer_size参数的设置大小。若是join语句不是不多的话,我的建议能够适当增大join_buffer_size到1MB左右,若是内存充足能够设置为2MB。对于sort_buffer_size来讲,通常设置为2-4MB能够知足大多数应用的需求。

当咱们使用explain来查询sql语句的查询计划的时候,type(join type)字段是一个很重要的观察对象。

ALL:对涉及到的表进行全表扫描,当表的数据量比较大的时候,全表扫描是比较费时费力的操做,这种状况是咱们要避免出现的。

index:对涉及到的索引进行索引扫描,跟ALL相似,在数据量较大的时候也是费时费力的操做,也是须要避免出现的情形。

range:使用索引查询必定范围的数据,这是咱们能够接受的操做。
到这里能够结合join_buffer_size的介绍进行部分总结:ALL、index这种操做是最坏状况下的操做,即便使用了join_buffer_size,当数据量较大的状况下也不会有很好的性能。range使用了索引,查询部分数据,使用join_buffer_size是能够提高性能的。因此咱们选择调优join_buffer_size参数的缘由在因而否使用了不少join type为range的join查询。

key_buffer_size=256M

指定索引缓冲区的大小,它决定索引处理的速度,你能够设置成系统的物理内存的1/4,它主要针对的是MyISAM引擎,可是设置大少不要超过4G,否则会出现问题。

max_connections = 1000

设置置MySQL的最大链接,按你实际状况适当设置就好。若是你常常看到‘Too many connections'错误,是由于max_connections的值过低了。

max_allowed_packet = 4M

这个参数mysql消息缓冲区的大小,限制server接受的数据包大小。有时候大的插入和更新会被max_allowed_packet 参数限制掉,致使失败。

max_connect_errors = 10000

表示若是有同一个主机访问mysql超出该参数值个数的中断错误链接,则该主机将被禁止链接。只针对链接错误,只计算协议握手错误,而且仅用于经过验证的主机(HOST_VALIDATED = YES)。

myisam_sort_buffer_size = 64M

针对Myisam表设置在REPAIR TABLE,或者用 CREATE INDEX 建立索引或 ALTER TABLE 的过程当中排序索引所分配的缓冲区大小。可设置范围4Bytes 至 4GB,默认为8MB。Sort Buffer 是单个线程的,因此当多个线程同时进行排序的时候,系统中就会出现多个Sort Buffer。通常能够经过增大 Sort Buffer 来提升 ORDER BY 或是 GROUP BY 的处理性能。

query_cache_type=1

表示查询缓存的类型,有三个参数可选(0、一、2)设置为0:表示没有使用缓存,设置为1:表示缓存全部的查询,设置为2:表示只缓存在select语句中经过SQL_CACHE指定须要缓存的查询结果。查询缓存会跟踪查询中涉及的每一个表,若是这写表发生变化,那么和这个表相关的全部缓存都将失效

能够在 SELECT 语句中指定查询缓存的选项,对于那些确定要实时的从表中获取数据的查询,或者对于那些一天只执行一次的查询,咱们均可以指定不进行查询缓存,使用 SQL_NO_CACHE 选项。
对于那些变化不频繁的表,查询操做很固定,咱们能够将该查询操做缓存起来,这样每次执行的时候不实际访问表和执行查询,只是从缓存得到结果,能够有效地改善查询的性能,使用SQL_CACHE 选项。

query_cache_size = 64M

参数表示mysql查询结果的缓冲区大小,通常不建议设置太大,由于设置太大会增长开销,通常设置成32M-256M左右便可,设置参数通常为2的倍数。

缓存存放在一个引用表中,经过一个哈希值引用,这个哈希值包括查询自己,数据库,客户端协议的版本等,任何字符上的不一样,例如空格,注释都会致使缓存不命中。当查询中有一些不肯定的数据时,是不会缓存的,比方说now(),current_date(),自定义函数,存储函数,用户变量,字查询等。因此这样的查询也就不会命中缓存,可是还会去检测缓存的,由于查询缓存在解析SQL以前,因此MySQL并不知道查询中是否包含该类函数,只是不缓存,天然不会命中。
对InnoDB表,当修改一个表时,设置了缓存失效,可是多版本特性会暂时将这修改对其余事务屏蔽,在这个事务提交以前,全部查询都没法使用缓存,直到这个事务被提交,因此长时间的事务,会大大下降查询缓存的命中 

read_buffer_size=4M

是MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。若是对表的顺序扫描请求很是频繁,而且你认为频繁扫描进行得太慢,能够经过增长该变量值以及内存缓冲区大小提升其性能。

read_rnd_buffer_size=4M

由于sort后的数据是以key-value的形式存在的,使用这些行指针去读取数据,将是以指针数据物理的顺序去读取,很大程度上是随机的方式读取数据的。MySQL从sort_buffer中读取这些行指针数据,而后经过指针排序后存入read_rnd_buffer中,以后再经过指针读取数据时,基本上都是顺序读取了。

read_rnd_buffer_size是很重要的参数,尤为工做在以下场景:

     * sort_buffer中存的是行指针而不是要查询的数据。

     * 查询的字段中包含Blob/Text字段。

     * sort后有大量的数据行(limit 10并不能帮助你,由于MySQL是经过指针获取行数据的)

若是你取出不多字段的数据(小于max_length_for_sort_data),行数据将会所有存储在sort buffer里,所以将不须要read_rnd_buffer_size这个参数。而若是你查询的字段数据很长(这些字段极可能含有Text/Blob字段),比max_length_for_sort_data还长,read_rnd_buffer_size这个参数将派上用场。

skip-external-locking

开启该选项表示避免MySQL的外部锁定,减小出错概率加强稳定性,适用于单服务器环境。

sort_buffer_size = 8M

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

table_open_cache=1024

table_cache主要用于设置table高速缓存的数量。因为每一个客户端链接都会至少访问一个表,所以此参数的值与max_connections有关。你能够经过命令show variables like '%open%'; 查看open_files_limit参数,大量使用MyISAM的环境里,应该保证open_files_limit表类型至少是table_cache的二到三倍,调到512-1024最佳。

thread_cache_size = 64

这个变量值表示的是能够从新利用保存在缓存中线程的数量,当断开链接时若是缓存中还有空间,那么客户端的线程将被放到缓存中,若是线程从新被请求,那么请求将从缓存中读取,若是缓存中是空的或者是新的请求,那么这个线程将被从新建立,若是有不少新的线程,增长这个值能够改善系统性能.经过比较 Connections 和 Threads_created 状态的变量,能够看到这个变量的做用 根据物理内存设置规则能够作如下配置2G-4G能够设置为16-64左右,固然大于4G的服务器,设置64也已经足够了。

thread_stack = 256K

表示每一个链接线程被建立时,MySQL给它分配的内存大小,对于8-16G的服务器设置成256K就能够了,再大一点的,能够适当增长呢。

tmp_table_size=64M

表示定义一个临时表的大小,该值默认为16M,可调到64-256最佳,线程独占,太大可能内存不够形成I/O堵塞,若是动态页面能够适当调大点。

wait_timeout = 10

表示指定一个请求的最大链接时间,该值过大会致使,MySQL里大量的SLEEP进程没法及时释放,拖累系统性能,不过也不能把这个指设置的太小,不然你可能会遭遇到“MySQL has gone away”之类的问题。  系统默认是8个小时,感受太大,能够设置小点。

相关文章
相关标签/搜索