mysql配置文件优化指南

发布时间:2019-11-08编辑:脚本学堂
本文介绍下,mysql配置优化中要注意的一些要点,可以帮助大家在处理mysql性能优化上提供一些经验,有需要的朋友参考下吧。

分享下mysql配置优化的相关要点,如下:
show variables like 'query_cache%'可以看到这些信息。
query_cache_limit
如果单个查询结果大于这个值,则不Cache
query_cache_size
分配给QC的内存。如果设为0,则相当于禁用QC。要注意QC必须使用大约 40KB来存储它的结构,如果设定小于40KB,则相当于禁用QC。QC存储的最小单位是1024 byte,所以如果你设定了一个不是1024的倍数的值,这个值会被四舍五入到最接近当前值的等于1024的倍数的值。
query_cache_type
0 完全禁止QC,不受sql语句控制(另外可能要注意的是,即使这里禁用,上面一个参数所设定的内存大小还是会被分配);1启用QC,可以在SQL语句使用SQL_NO_CACHE禁用;2可以在SQL语句使用SQL_CACHE启用。
query_cache_min_res_unit
每次给QC结果分配内存的大小
关于query_cache_size的应用可以看
long_query_time 设定慢查询时间
log-slow-queries = /tmp/slow.log 慢查询生成的日志文件
关于这两个选项的应用可以参考
key_buffer_size = 256M # key_buffer_size指定用于索引的缓冲区大小,增加它可得到更好的索引处理性能。对于内存在4GB左右的服务器该参数可设置为256M或384M。 注意:该参数值设置的过大反而会是服务器整体效率降低! 只选用于myisam
external-locking 禁止使用外部锁,可预防死锁
max_connections = 1024 #允许的同时客户的数量。增加该值增加 mysqld要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 Too many connections 错误。 默认数值是100
back_log 临时停止响应新请求前在短时间内可以堆起多少请求。如果你需要在短时间内允许大量连接,可以增加该数值
table_cache 缓存数据表的数量,避免重复打开表的开销
thread_cache_size 缓存可重用线程数,减少创建新线程的开销
thread_concurrency = 4 #最大并发线程数,cpu数量*2
sort_buffer_size = 6M #查询排序时所能使用的缓冲区大小。注意:该参数对应的分配内存是每连接独占!如果有100个连接,那么实际分配的总共排序缓冲区大小为100 × 6 = 600MB。所以,对于内存在4GB左右的服务器推荐设置为6-8M。
read_buffer_size = 4M #读查询操作所能使用的缓冲区大小。和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!
join_buffer_size = 8M #联合查询操作所能使用的缓冲区大小,和sort_buffer_size一样,该参数对应的分配内存也是每连接独享!
read_rnd_buffer_size = 8M #加速排序操作后的读数据,提高读分类行的速度。如果正对远远大于可用内存的表执行GROUP BY或ORDER BY操作,应增加read_rnd_buffer_size的值以加速排序操作后面的行读取。仍然不明白这个选项的用处……
myisam_sort_buffer_size = 64M #设置,恢复,修改表的时候使用的缓冲大小,值不要设的太大
。不明白这个选项的用处,百度上找到的设置方向也是五花八门,有128M、64M、32M等,折中选一个。
#mysql 的配置文件中,tmp_table_size 的默认大小是 32M。如果一张临时表超出该大小,MySQL产生一个 The table tbl_name is full 形式的错误,如果你做很多高级 GROUP BY 查询,增加 tmp_table_size 值。
tmp_table_size = 32M
#当内存表中的数据大于max_heap_table_size设定的容量大小时,mysql会转换超出的数据存储到磁盘上,因此这是性能就大打折扣了,所以我们还需要根据我们的实际情况调整max_heap_table_size,例如在.cnf文件中[mysqld]的下面加入:
另外在建表语句中还可以通过MAX_ROWS来控制表的记录数。
max_heap_table_size = 2048M

参考:
query_prealloc_size #查询分析器预分配缓存
max_allowed_packet = 4M #一个包的最大尺寸。消息缓冲区被初始化为net_buffer_length字节,但是可在需要时增加到
max_allowed_packet个字节。缺省地,该值太小必能捕捉大的(可能错误)包。如果你正在使用大的BLOB列,你必须增加该值。它应该象你想要使用的最大BLOB的那么大。
#关闭不需要的表类型,如果需要就不要加上这个。
skip-innodb
skip-bdb
skip-locking # 避免MySQL的外部锁定,减少出错几率增强稳定性。
skip-name-resolve #
禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!
#设置超时时间,能避免长连接
wait_timeout = 120
skip-networking #开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问mysql数据库服务器则不要开启该选项!否则将无法正常连接!
#log-bin开启log-bin会使性能下降 46%
innodb_buffer_pool_size 控制分配给包括集群数据以及次要索引页的Innodb缓存的内存总数,默认16MB
innodb_additional_mem_pool_size 控制分配给对Innodb内部数据字典进行排序所需的缓冲,默认1MB
innodb_log_buffer_size 控制分配给对Innodb存储提前写日志记录所需的缓冲,默认1MB
innodb_log_files_in_group 在日志组里日志文件的数目。InnoDB以循环方式写进文件。默认是2(推荐)
innodb_log_file_size 默认是5MB。建议值从1MB到N分之一缓冲池大小,其中N是组里日志文件的数目
innodb_flush_log_at_trx_commit
抱怨Innodb比MyISAM慢 100倍?可能没有调整这个值。
默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,即不写入硬盘而是写入系统缓存。

日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。
设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。
而值2只会在整个操作系统挂了时才可能丢数据。