mysql数据库生产环境性能优化总结,纯干货!!!(三)
mysql数据库生产环境性能优化总结,纯干货!!!(三)
从mysql配置的角度优化数据库
1.优化mysql的线程缓存
在生产环境中,会有很多请求连接到数据库。为此系统就需要创建线程处理这些请求。然而如果来一个请求就创建一个线程就会极大地降低了mysql的工作效率,占用了大量的计算资源。为此我们需要预先缓存好线程等待请求的到来。
所以可以通过查看现在的已连接的线程数来预估计需要缓存的大小。
查看命令:
mysqladmin -p extended-status -r -i 10 | grep Threads_connected
这里 -r代表先取一个基准值,每隔10秒相对于基准值的变化。-i代表每隔多长时间查看一次。
一般我在运维的时候Threads_connected的浮动在300-350之间,会将thread_cache_size设置在50M左右。缓存的大小一般取决于你在生产环境中的经验和硬件设备。一般内存较大的设备可以设置相对较大的缓存。或者通过命令监控发现连接数浮动较大,我就会将缓存相应的增大。
查看连接缓存大小命令为:
show global variables like 'thread_cache_size';
修改进程缓存的方法:
一:修改配置文件,永久修改:
[mysqld]
thread_cache_size = 20
二:临时修改,计算机重启后失效。
set global thread_cache_size = 20;
修改完之后,我们再次查看进程缓存发生了改变。
2.修改全表扫描的缓存
read_buffer_size表示mysql数据库在使用顺序扫描的的方式扫描全表时所使用的的缓存。为了降低对磁盘所需要的的I/O压力,我们可以根据生产环境的经验适当的增加缓存的大小。
查看方法:
show global variables like 'read_buffer_size';
修改方法一:修改配置文件永久
[mysqld]
read_buffer_size = 110000
修改方法二:临时修改
set global read_buffer_size=102400;
3.优化Myisam的索引缓存
当我们用Myisam存储引擎存储数据时,在查询数据时是将索引以文件的形式存储在磁盘上的(*.MYI)。Myisam所使用的的缓存:key_buffer_size,所使用的的缓存并非mysql说占用的内存,而是将mysql内存之外的空间当做缓存。所以在设置的时候需要注意如果当前服务器没有足够多的内存空间,不要设置太大的key_buffer_size,有可能会造成内存溢出造成服务器崩溃。所以这个数字不应超过索引大小或者为系统保留大约25-50%的内存。
查看key_buffer_size
select sum(index_length) from information_schema.tables where engine='myisam';
我们也可以通过命令去查看在一段时间内,缓存的使用情况。如果缓存一直处于未命中的情况,就表示缓存过小,查询是从磁盘中读取的。为此我们需要过大缓存。
mysqladmin -p extended-status -r -i 10 | grep Key_read
修改方法:修改配置文件(永久修改)
4.优化Myisam连接缓冲
每当有连接连入到数据库,数据库就会分配一些缓存给每个连接。在设置好缓冲之后,数据库就会分配给每个连接,无论每个连接需求是多少,数据库只会分配给每个连接固定的缓冲。即缓冲设定好了之后便无法修改,过少、过大的缓冲都不行。总需求是设定的缓冲大小*连接数。太小的缓冲,不够用。太大的缓冲又浪费资源。
修改方式:
myisam_sort_buffer_size=30M
innodb_sort_buffer_size=30M
sort_buffer_size=30M
5.Myisam表修复优化
在生产环境中如果遇到突发状况,如断电等。数据库崩溃会导致Myisam表发生损坏。当我们用Myisamchk命令去修复Myisam表的时候可能会浪费大量的时间。因为在重建时候需要全表扫描,如果是一张大表会需要消耗大量的时间。每一行进行扫描,扫描完之后还需要重建索引。所以为了优化重建表的时间,我们可以设置并行线程数,Myisam_repair_threads.其影响了创建索引是并行的线程数,也优化了表修复的repair by storing阶段。默认线程数是1.
Myisam_repair_threads=1