最近的项目使用了spring和mysql,但在性能上出了问题,刚开始一直不能找到瓶颈在哪里,就不断的摸索,经过一系列的测试后,确定了在使用spring的transactionnal的注解时,mysql提交事务时花费的时候几乎是用了100ms,这是让人很难接受的。
刚开始怀疑是不是我们的在使用spring的事务管理器上有问题,后来有怀疑是不是对于@Transactional注解的使用上有问题,但是没有得到实质性的突破,终于在今天早上看到了关于mysql的事务优化方面的博客,最后经过测试发现,经过以下做法修改后,性能的提升是显而易见的。
使用以下命令进行修改mysql的配置
show variables like 'innodb_flush_log_at_trx_commit'; set global innodb_flush_log_at_trx_commit = 2; show variables like 'innodb_flush_log_at_trx_commit';
具体解释如下:
innodb_flush_log_at_trx_commit属性主要控制了innodb将log buffer中的数据写入日志文件,并且刷新磁盘的时间点,取值有0、1(mysql默认值)、2。
0:事务提交时,不做日志写入操作,而是每秒钟将log buffer中的日志写入文件并且flush磁盘一次。
1:每秒钟或者事务提交时,都会引起日志写入和flush磁盘操作,这样设计也是最安全的。
2:每次事务提交时,进行日志写入,但此时没有flush磁盘操作,而是在每秒钟时进行flush磁盘操作。
在设置mysql的innodb_flush_log_at_trx_commit属性为2时,每次提交事务时,就没有引起flush磁盘操作,这样的话,就会节省很多时间,我们的项目中平均40ms处理完一次操作,而该操作完了以后会释放事务,如此来说,1s钟内就省去了磁盘刷新的时间。而原来的这种情况下,事务提交一般都要花费40ms的时间,在多并发的情况下,甚至达到了200ms的时间,这是非常可怕的事情,而现在,普通情况下,一次事务提交所花费的时间就基本控制在个位毫秒级别上。
当然查看资料后,将innodb_flush_log_at_trx_commit设置为
0:mysql进程崩溃时,会丢失数据
1:每次事务日志缓冲都会写入磁盘
2:操作系统崩溃、断电情况下,会丢失最后一秒钟内的数据
以上情况需要根据所处的软件环境而定,而我们项目中目前设置为2已经足够了。
开心。。。。。。