IO相关配置参数

前面介绍了内存相关的配置信息,也就是IO相关的配置参数,这部分参数决定了MYSQL如何同步缓冲池中的数据,

到磁盘上,以进行数据持久化的保存,这些操作对性能的影响非常的大,如果要保证数据修改后立即写入到磁盘上,

那是一个很昂贵的操作,前面我们介绍了IO的操作成本是很高的,所以我们要在性能和安全性上做一个平衡,有时候

我们为了提高性能就不得不牺牲一些安全性,由于IO配置呢总是和我们选择的存储引擎是相关的,所以我们在这里

分不同的存储引擎呢,来给大家介绍一下相关的参数,主要还是介绍innodb和myisam两种引擎的相关配置,我们先来

看看innodb存储引擎,关于IO操作的相关配置有哪些,我们知道innodb是一种事务型的存储引擎,为了减少提交事务

时所产生的IO开销,在事务提交的时候呢,会先写入到事务日志中,而不是每次都把修改后的数据呢,刷新到数据文件中,

这样做是为了提高IO的性能,因为事务的修改呢,使数据和索引文件通常都会映射到表空间的低的位置,所以刷新数据

到文件呢,就会产生大量的随机IO,而记录日志呢,所需要的是顺序的IO,所以相比脏数据到数据文件系统来说呢,记录事务日志的

方法呢要快的多,一旦事务日志安全的写入到磁盘中,事务算是持久化了,因为即使变更还没有写入到数据文件,如果这个时候

发现了服务器的宕机,这样的情况我们还是可以使用事务日志,来恢复已经提交的事务,Innodb_log_file_size控制了,

单个事务日志的大小,而innodb_log_files_in_group呢,则控制了事务日志文件的个数,那么事务日志的总大小呢,

为Innodb_log_files_in_group*Innodb_log_file_size,事务日志是循环使用的,写满一个后才会使用下一个,所以从前

有一个说法,多建立几个事务日志文件,这样就可以并发写入,以获得更好的IO性能,这样的做法呢,现在看来是没有任何意义的,

所以在配置时,我们就不用管Innod_log_file_in_group这个参数,只要修改单个日志文件的大小就可以了,至于单个日志文件的

大小呢,这就和我们的业务情况有关系了,如果业务非常繁忙,建议把日志文件设置的大一些是有好处的,一般情况下来说,

事务日志的总大小,应该可以记录服务器一个小时的事务的信息,事务日志呢,并不是每次提交呢,都写到日志文件中的,

而是先写入到事务日志的缓冲区,然后再刷新到磁盘中,变量Innodb_log_buffer_size呢,用于控制日志缓冲区的大小,

通常不需要把日志缓冲区设置的非常大,因为一般情况下呢,至少1秒钟我们就会形成一次事务日志缓存的刷新,所以缓冲区呢,

可以保留至少1秒钟的事务就已经足够了,当然稍微多一些呢,也没有什么坏处,但是总的来说呢,32M到128M配置就已经可以了,

相对于日志缓冲区来说,刷新事务日志的频繁程度对性能的影响可能会更大一些

而事务日志刷新的事务日志的频繁程度呢,是由Innodb_flush_log_at_trx_commit参数来决定的,这个参数有三个选择,

分别为0,每秒钟进行一次log写入到操作系统cache,并刷新log到磁盘,但是当事务提交时呢,不会做任何事情,这个设置

在MYSQL奔溃时呢,会只是找丢失1秒钟的事务,而当把我们这个参数值设置为1时呢,就表示每次在事务提交的时候呢,都会

执行log写入操作系统cache,并刷新操作系统cache log到磁盘文件持久化的存储的操作,这个设置是最安全的设置,同时也是

我们MYSQL的默认配置,该设置可以保证不会丢失任何已经提交的事务,除非是磁盘或者是操作系统,做了一种伪刷新,这个值的

安全性很高,但是性能也是最差的,另外这个参数值还可以设置为2,表示事务提交后,执行log数据写入到操作系统cache的这个操作,

并且每秒钟执行一次从操作系统的cache刷新到磁盘文件的log操作,0与2最重要的区别是,如果MYSQL进程奔溃了,设置为2时不会

丢失任何的事务,只有在整个服务器宕机时,才能丢失至少1秒的事务,所以建议大家,把这个参数设置为2,大家可能注意到了,

事务日志从缓存刷新到磁盘,实际上是需要两步的,首先要从MYSQL事务日志缓存区,刷新到操作系统的cache,这实际上还是在

内存中,只有第二步到操作系统的cache,去刷新到磁盘日志文件的时候呢,才算是真正完成事务的持久化

除了上面介绍的参数外,还有一些存储引擎的IO有影响的参数,下面我们给出这些参数的名字,相关的一些参数的建议,

首先是Innodb刷新的方式,这个参数决定了Innodb数据文件,和日志文件,如何跟文件系统进行交互,这个参数不仅会

影响Innodb写数据,同时也影响Innodb读取数据,对于Linux类系统呢,建议把这个值设置为O_Direct,这个设置会通知

操作系统,不要缓存数据,也不要预读,也就是说,这个选项完全关闭了操作系统的缓存,并且使所有读和写呢,都直接

通过存储设备,来完成,避免了Innodb和操作系统,对于数据的双重缓存,关于这个参数呢,还有很多可选的值,而且对于

MYSQL系统来说呢,和Linux配置的值也是有区别的,如果大家感兴趣的话,可以查一查MYSQL的相关手册,我这里就不过多

介绍了,应用通常来说呢,如果使用的是linux系统的话呢,O_DIRECT就是我们最好的选择了,下一个参数呢,就是我们之前

给大家介绍的,Innodb_file_per_table,这个参数之前也给大家介绍过,主要是控制Innodb如何使用表空间,如果设置了

这个参数呢,Innodb会为每一个表建立一个单独的表空间,否则就会把所有的Innodb表的数据呢,存储到系统表空间中,

这里强烈建议大家启用这个参数,下一个就是Innodb_doublewrite,这个控制innodb是否双写缓存,双写缓冲呢,主要是避免

没有写完整所导致的数据损坏,大家知道,Innodb一个硬件默认大小是16K,而当系统奔溃或程序bug造成了一个磁盘写操作呢,

不能够完整的完成,这种不完整的写入呢就可能会发生,会造成16K数据不完整的写到数据文件中,这时数据文件就会损坏,

而双写缓存呢,为了避免发生这样的情况,所以建议大家启用双写缓存以增加数据的安全性,这虽然会对性能有一些影响,

但是对于性能的影响并不会太大,和数据安全性相比呢,还是可以接受的,除了Innodb存储引擎,MYISAM也是一种常用的

存储引擎,更主要的是目前MYSQL的系统表呢,还在使用MYISAM这种存储引擎,所以我们对MYISAM如何进行IO配置也要进行

一下了解

在Innodb存储引擎的配置中呢,我们可以使用innodb_flush_log_trx_commit参数来控制日志缓冲

刷新到磁盘日志文件的频率,而在MYISAM中同样也存在相关的参数,这个参数就是delay_key_write,这个参数起到了

相似的作用,这个参数控制关键字缓存中的什么时候可以刷新到磁盘文件中,这个参数有三个可选的值,分别是OFF,

表示关闭延迟写入,每次写操作后刷新缓冲中的脏块到磁盘中,这就是最安全的选项,同时每次写操作都需要磁盘的

写操作,也是性能比较差的一个选项了,另外 一个参数是ON,只对在建表时指定了delay_key_write选项的表使用延迟刷新,

还有一个可选值就是ALL,对所有MYISAM表都使用延迟键写入,需要注意的一点是,如果启用了延迟写入的话,服务器发生

奔溃,并且缓存中呢,有的块没有写入磁盘文件,那么这个时候就会造成MYISAM表索引的严重的损坏,这个时候我们就需要

对MYISAM表进行修复了,至于如何修复呢,之前我们在介绍MYISAM存储引擎中呢,已经为大家讲解过了,就是使用repair_table

这个命令,来修复就可以了

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值