MySQL参数优化(重点)
优化的起因: 1)网站出问题,很慢。show full processlist; 2)慢查询语句(日志文件) long_query_time = 1 log-slow-queries = /var/lib/mysql/slow.log
案例:某公司案例:网站打开慢 数据库负载很高,load直20-30 [root@weixin-pin2 ~]# uptime 17:03:19 up 15 days, 7:11, 1 user, load average: 20, 15, 10 登录数据库查看:show full processlist; 说明:数据库中像like ‘%啊方法%’ 这样的语句特别多,导致数据库负载很高,like ‘%啊方法%’ 这样的语句对于MySQL数据库没有太大的优化余地。 优化方案思路: 1)从业务上实现用户登录后再搜索,这样减少搜索次数,从而减轻数据库服务的压力。 2)如果有大量频繁的搜索,一般是有爬虫子啊爬你的网站,分析WEB日志IP封掉 3)配置多个主从同步,程序上实现读写分离(最好让like ‘%啊方法%这样的查询去从库查),减轻读写压力。 4)在数据库前端加上memcached缓存服务器 5)like ‘%啊方法% 的语句一般在mysql里很难优化,可以通过搜索服务Sphinx实现搜索 6)可以利用c,ruby开发程序,实现每日读库计算搜索索引,保存在服务器上提供搜索,如何,每五分钟多一个从库做一次增量。 MySQL数据库优化: 1.硬件优化:物理机 a.×64CPU 一台机器8-16颗 2-4颗 b.内存(mem) 96-128G 一台服务器 3-4个实例 32-64G,跑2个实例 c. disk 数量越多越好 性能:ssd(高并发)>sas(线上)>sata(线下) raid 4块盘:RAID >RAID10>RAID5>RAID1 d.网卡 多块网卡bond,以及buffer,rcp优化。 软件优化: 操作系统:×86_64系统 软件:MySQL编译优化。
2.my.cnf参数优化 my.cnf优化的幅度很小。大部分架构以及SQL语句的调优。 innodb_buffer_pool_size = 4096M 配置到物理内存的二分之一或者三分之一 这个是Innodb最重要的参数,和MyISAM的key_buffer_size有相似之处,但也是有差别的。这个参数主要是缓存Innodb表的索引,数据,插入数据时的缓冲。 该参数分配内存的原则: 这个参数默认分配只有8M,可以说是非常小的一个值。如果是一个专用DB服务器,那么他可以占到内存的70%-80%。这个参数不能动态更改,所以分配需多考虑。分配过大,会使Swap占用过多,致使MySQL的查询特慢。如果你的数据比较小,那么可分配是你的数据大小+10%左右作为这个参数的值。 例如:数据大小为50M,那么给这个值分配Innodb_buffer_pool_size=64M 设置方法:在my.cnf文件里 innodb_buffer_pool_size=4G 注意:在MySQL5.7之前,调整innodb_buffer_pool_size大小必须在my.cnf配置里修改,然后重启mysql进程才可以生效。如今到了MySQL版本,就可以动态调整这个参数,方便了很多。尤其是在服务器内存增加了之后,运维人员不能粗心大意,要记得调大innodb_buffer_pool_size这个参数,数据库配置后,要检查Innodb_buffer_pool_size这个参数设置是否合理。 在调整innodb_buffer_pool_size期间用户的请求将会阻塞,知道调整完毕,所以请勿白天在白天调整,在凌晨3-4点低峰期调整。调整时,内部把数据页移动到一个新的位置,单位时块。如果想增加移动的速度,需要调整innodb_buffer_pool_chunk_size的参数的大小,默认时128M。 innodb_additional_men_pool_size = 16M 用来存放Innodb的内部目录,这个值不用分配太大,系统可以自动调。通常设置16M够用了,如果表比较多,可以适当的增大。 设置方法,在my.cnf文件里: innodb_additional_men_pool_size=16M