总结一下MySQL常用的调优方法

前言
作为一名运维,工作中跟mysql打交道一定少不了,那么当面试官问,你是如何优化mysql的,想必你心中多多少少会有答案。今天我就总结一下常用的调优方法。
架构层面
俗话说,众人拾柴火焰高。当一台mysql顶不住时,我们就增加一台或者多台呗。最简单的方法,就是做一个主从架构,然后给它加一层代理(如mysql-proxy),然后设置其读写分离,将读和写分开,当读操作时,可以到所有mysql服务器上去请求,从而实现负载均衡。 再高级一点,将单台mysql做成mysql cluster模式,也会提升整体性能。
系统层面
增加内存,mysql服务是比较耗费内存的,将内存加大,然后调整其参数,从而使其处理更多请求;
给磁盘做raid10或者raid5以增加磁盘的读写速度;
可以重新挂载磁盘,并加上noatime参数,这样可以减少磁盘的i/o;
mysql自身层面
如果未配置主从同步,可以把bin-log功能关闭,减少磁盘i/o;
在my.cnf中加上skip-name-resolve,这样可以避免由于解析主机名延迟造成mysql执行慢;
调整几个关键的buffer和cache。调整的依据,主要根据数据库的状态来调试;
针对某些数据量很大的库或者表,进行分开分表,从而使其查询速度更快;
应用层面
查看慢查询日志,根据慢查询日志优化程序中的sql语句,比如增加索引。首先要保证慢查询日志已经配置:
slow_query_log = on #开启慢查询日志slow_query_log_file = /data/mysql/slow.log #慢查询日志路径long_query_time = 1 #查询超过多少秒就会记录日志  
buffer和cache
key_buffer_size  首先可以根据系统的内存大小设定它,大概的一个参考值:1g以下内存设定128m;2g/256m; 4g/384m;8g/1024m;16g/2048m。这个值可以通过检查状态值key_read_requests和key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用show status like 'key_read%'获得)。注意:该参数值设置的过大反而会使服务器整体效率降低!
table_open_cache 打开一个表的时候,会临时把表里面的数据放到这部分内存中,一般设置成1024就够了,它的大小我们可以通过这样的方法来衡量:如果你发现 open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用show status like 'open%tables'获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。  
sort_buffer_size 查询排序时所能使用的缓冲区大小,该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 4 = 400mb。所以,对于内存在4gb左右的服务器推荐设置为4-8m。  
read_buffer_size 读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!  
join_buffer_size 联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!  
myisam_sort_buffer_size 这个缓冲区主要用于修复表过程中排序索引使用的内存或者是建立索引时排序索引用到的内存大小,一般4g内存给64m即可。  
query_cache_size mysql查询操作缓冲区的大小,通过以下做法调整:show status like 'qcache%'; 如果qcache_lowmem_prunes该参数记录有多少条查询因为内存不足而被移除出查询缓存。通过这个值,用户可以适当地调整缓存大小。如果该值非常大,则表明经常出现缓冲不够的情况,需要增加缓存大小;qcache_free_memory:查询缓存的内存大小,通过这个参数可以很清晰的知道当前系统的查询内存是否够用,是多了,还是不够用,我们可以根据实际情况做出调整。一般情况下4g内存设置64m足够了。  
thread_cache_size 表示可以重新利用保存在缓存中线程的数,参考如下值:1g  —> 8     2g  —> 16    3g  —> 32    3g  —> 64。    
除此之外,还有几个比较关键的参数:
thread_concurrency 这个值设置为cpu核数的2倍即可。  
wait_timeout 表示空闲的连接超时时间,默认是28800s,这个参数是和interactive_timeout一起使用的,也就是说要想让wait_timeout 生效,必须同时设置interactive_timeout,建议他们两个都设置为10。  
max_connect_errors 是一个mysql中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。与性能并无太大关系。为了避免一些错误我们一般都设置比较大,比如说10000。  
max_connections 最大的连接数,根据业务请求量适当调整,设置500足够  
max_user_connections 是指同一个账号能够同时连接到mysql服务的最大连接数。设置为0表示不限制。通常我们设置为100足够。


微软已修复Windows102004设备用户显示器黑屏问题
米粉期待的来了:小米平板3将于4月6日发布! 5月量产,依旧情怀价你期待吗?
DG900函数/任意波形发生器的功能及产品特点分析
武汉凯迪正大保护回路矢量分析仪产品概述
PLC IO里面的PNP和NPN它们之间有什么区别呢?
总结一下MySQL常用的调优方法
KMZ10薄膜磁敏电阻元件
从307批公告看宁德时代与比亚迪争锋
俄罗斯干扰GPS信号,英国寻找替代品!自研导航系统很关键!
二极管保护电路及故障检测
华为nova2怎么样?华为nova2主打拍照高颜值,这款2499元新机到底值不值得买?
莫之比隆重推出大货车盲区监测雷达
救护车警笛电路设计调试分享
苹果高通和解从短期来看高通或者是最大的获益者
中芯长电二期项目正式进入运营阶段 将全力向3DIC硅片级系统集成加工这一产业高地发起冲击
探究锂离子电池工作原理与制造工艺
泰尔认证中心向vivo颁发国内首批手机适老化认证证书
电路中为什么要使用光耦器件?
MOSFET作为开关案例及控制表
了解冷藏集装箱温度实时监测系统的应用