0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作;
1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。
此外,MySQL文档中还提到,这几种设置中的每秒同步一次的机制,可能并不会完全确保非常准确的每秒就一定会发生同步,还取决于进程调度的问题。实际上,InnoDB 能否真正满足此参数所设置值代表的意义正常 Recovery 还是受到了不同 OS 下文件系统以及磁盘本身的限制,可能有些时候在并没有真正完成磁盘同步的情况下也会告诉 mysqld 已经完成了磁盘同步。
innodb_max_dirty_pages_pct 参数用来控制在 InnoDB 缓冲池(Buffer Pool) 中可以不用写入数据文件中的脏页(Dirty Page) 的比例(已经被修但还没有从内存中写入到数据文件的脏数据)。这个比例值越大,从内存到磁盘的写入操作就会相对减少,所以能够一定程度下减少写入操作的磁盘IO。但是,如果这个比例值过大,当数据库崩溃(Crash)之后重启的时间可能就会很长,因为会有大量的事务数据需要从日志文件恢复出来写入数据文件中。同时,过大的比例值同时可能也会造成在达到比例设定上限后的 flush 操作“过猛”而导致性能波动很大。如果这个参数设置过大,将会导致MySQL启动时间过长,关闭时间也过长。
连接参数
MySQL数据库操作是建立在MySQL数据库连接的基础上,所以提高MySQLl处理连接的能力,也是提高MySQL的性能的一个重要途经。
连接数量
相关参数:max_connections / back_log
max_connections参数设置MySQL的最大连接数,也就是允许同时连接的客户数量。如果服务器的并发连接请求比较大,建议调高此值,以增加并行连接数量。但连接数越大,MySQL会为每个连接提供连接缓冲区,就会开销越多的内存,服务器消耗的内存越多,可能会影响服务器性能,所以要根据服务器的配置适当调整该值,不能盲目提高设值。默认数值是100。
计算MySQL繁忙时处理连接的情况,建议值50% ~ 80%
max_used_connections / max_connections * 100%
back_log参数设置MySQL能暂存的连接数量。当MySQL在一个很短时间内收到非常多的连接请求时起作用。如果MySQL的连接数达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。设定back_log高于你的操作系统的限制是无效的。默认数值是50。
连接超时
相关参数:wait_timeout / interactive_timeout
服务器关闭连接之前等待活动的秒数。MySQL所支持的最大连接数是有限的,因为每个连接的建立都会消耗内存,因此我们希望MySQL 处理完相应的操作后,应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,可以进行适当的调整小些。建议120 ~ 300
连接检查
相关参数:skip-name-resolve
skip-name-resolve参数用于禁止DNS的反向解析。MySQL默认开启了DNS的反向解析,当有新的连接到来时,MySQL会解析连接主机的DNS,这就影响了连接速度。使用该参数也有一个代价,就是每次连接都要使用ip地址,就不能再使用localhost,改成127.0.0.1
配置建议值
根据以往经验取值,仅供参考,不一定适用于所有场景,建议在生产环境中进一步分析调整
| MySQL配置 | 建议值说明 |
| table_open_cache | 如果设置太大,会造成系统不稳定或者数据库连接失败,建议最大512 |
| query_cache_type | 没有使用MyISAM引擎,建议0;否则建议1,如果写入过于频繁,建议2 |
| query_cache_size | 根据实际命中率进行调整,不需要太大,建议256MB |
| binlog_cache_size | 建议2MB ~ 4MB,事务较大且写入频繁可以适当调大,但不要超过32MB |
| key_buffer_size | 如果使用MyISAM,在内存允许的情况下,尽可能加大,参考值 512MB |
| bulk_insert_buffer_size | 如果经常性的需要使用批量插入数据,可以适当调大至32MB |
| innodb_buffer_pool_size | 如果使用InnoDB,在内存允许的情况下,可以设置50% ~ 80%内存 |
| innodb_log_buffer_size | 默认是1MB,数据库操作频繁的系统可适当增大至4MB ~ 16MB |
| innodb_max_dirty_pages_pct | 这个值越大,数据库启动时间和关闭时间越长,可以适当调大至90 |
| max_connections | 根据实际情况取值,过大反而影响性能。默认值100,建议128 ~ 512 |
| back_log | 默认数值是50,建议 128 ~ 256 |
| wait_timeout | 同时修改interactive_timeout,默认28800(8小时),建议120 ~ 300 |
可能用到的MySQL命令:
# 查看当前MySQL运行状态值
mysql> show global status like 'Thread_%';
# 查看当前MySQL配置信息
mysql> show global variables like '%binlog%';
参考
http://blog.csdn.net/mycwq/article/details/16370525
http://isky000.com/database/mysql-perfornamce-tuning-cache-parameter
http://database.51cto.com/art/201010/229939.htm
http://jackyrong.iteye.com/blog/781859