前面介绍了内存相关的配置信息,也就是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
这个命令,来修复就可以了