同步是一个昂贵的操作(特别是当你没有写回缓存时),因为它涉及对硬盘的实际同步物理写入 。所以如果可能,并不建议使用默认值 。
两个可选的值是0和2:
* 0表示刷新到硬盘 , 但不同步(提交事务时没有实际的IO操作)
* 2表示不刷新和不同步(也没有实际的IO操作)
所以你如果设置它为0或2,则同步操作每秒执行一次 。所以明显的缺点是你可能会丢失上一秒的提交数据 。具体来说,你的事务已经提交了,但服务器马上断电了 , 那么你的提交相当于没有发生过 。
显示的 , 对于金融机构 , 如银行,这是无法忍受的 。不过对于大多数网站,可以设置为innodb_flush_log_at_trx_commit=0|2,即使服务器最终崩溃也没有什么大问题 。毕竟,仅仅在几年前有许多网站还是用MyISAM,当崩溃时会丢失30s的数据(更不要提那令人抓狂的慢修复进程) 。
那么,0和2之间的实际区别是什么?性能明显的差异是可以忽略不计 , 因为刷新到操作系统缓存的操作是非常快的 。所以很明显应该设置为0,万一MySQL崩溃(不是整个机器),你不会丢失任何数据,因为数据已经在OS缓存,最终还是会同步到硬盘的 。
5.SYNC_BINLOG
已经有大量的文档写到sync_binlog,以及它和innodb_flush_log_at_trx_commit的关系,下面我们来简单的介绍下:
a) 如果你的服务器没有设置从服务器,而且你不做备份,那么设置sync_binlog=0将对性能有好处 。
b) 如果你有从服务器并且做备份,但你不介意当主服务器崩溃时在二进制日志丢失一些事件,那么为了更好的性能还是设置为sync_binlog=0.
c) 如果你有从服务器并且备份,你非常在意从服务器的一致性,以及能及时恢复到一个时间点(通过使用最新的一致性备份和二进制日志将数据库恢复到特定时间点的能力),那么你应该设置innodb_flush_log_at_trx_commit=1,并且需要认真考虑使用sync_binlog=1 。
问题是sync_binlog=1代价比较高 – 现在每个事务也要同步一次到硬盘 。你可能会想为什么不把两次同步合并成一次,想法正确 – 新版本的MySQL(5.6和5.7,MariaDB和Percona Server)已经能合并提交 , 那么在这种情况下sync_binlog=1的操作也不是这么昂贵了 , 但在旧的mysql版本中仍然会对性能有很大影响 。
6.INNODB_FLUSH_METHOD
将innodb_flush_method设置为O_DIRECT以避免双重缓冲.唯一一种情况你不应该使用O_DIRECT是当你操作系统不支持时 。但如果你运行的是Linux , 使用O_DIRECT来激活直接IO 。
不用直接IO , 双重缓冲将会发生 , 因为所有的数据库更改首先会写入到OS缓存然后才同步到硬盘 – 所以InnoDB缓冲池和OS缓存会同时持有一份相同的数据 。特别是如果你的缓冲池限制为总内存的50%,那意味着在写密集的环境中你可能会浪费高达50%的内存 。如果没有限制为50%,服务器可能由于OS缓存的高压力会使用到swap 。
简单地说,设置为innodb_flush_method=O_DIRECT 。
7.INNODB_BUFFER_POOL_INSTANCES
MySQL 5.5引入了缓冲实例作为减小内部锁争用来提高MySQL吞吐量的手段 。
在5.5版本这个对提升吞吐量帮助很小,然后在MySQL 5.6版本这个提升就非常大了,所以在MySQL5.5中你可能会保守地设置innodb_buffer_pool_instances=4,在MySQL 5.6和5.7中你可以设置为8-16个缓冲池实例 。
你设置后观察会觉得性能提高不大,但在大多数高负载情况下 , 它应该会有不错的表现 。
对了,不要指望这个设置能减少你单个查询的响应时间 。这个是在高并发负载的服务器上才看得出区别 。比如多个线程同时做许多事情 。
推荐阅读
- 硬盘错误怎么搞啊,电脑硬盘显示错误
- linux清屏命令是什么,linux清理屏幕快捷键
- 枪战慢动作游戏,慢动作枪神
- 公众号怎么申请会员,公众号怎么申请会员账号
- c语言嵌套式if函数 c语言嵌套if语句格式
- 英语什么水平可以上直播课,英语什么水平可以当老师
- 微视号如何推广唯品会,微视怎么发商品链接
- 微信公众号粉丝查询工具下载安装,微信公众号粉丝查询工具下载安装不了
- oppo怎么手机投屏,oppo手机如何 投屏