目前lnnodb_flush_log_at_trx_commit=1的时候插入40万条数据需要
mysql> CALL InsertData();
Query OK, 1 row affected (8 min 40.16 sec)
将近9分钟,太慢了
因为参数为1时,每一个事务都要写到磁盘里面去,太慢了,虽然安全,但是效率太低,要寻找平衡点
将lnnodb_flush_log_at_trx_commit=2时,让他每秒刷新一次磁盘,可以发现快了将近一倍
mysql> CALL InsertData();
Query OK, 1 row affected (4 min 59.48 sec)
这是对于redo log的提交的优化,当然我们还可以对于sync_binlog进行修改
默认的sync_binlog=1,每次有一个日志就需要写入到磁盘,太慢了,虽然安全性好,但是性能低
这里我们将参数调整为sync_binlog=1000,当满足提交日志组的数量达到这个上限时调用文件系统的sync进行缓存的刷新,磁盘里面去
mysql> call InsertData();
Query OK, 1 row affected (3 min 32.48 sec)
上面是分别对于sync_binlog和lnnodb_flush_log_at_trx_commit参数的修改,接下来对于两个参数都进行修改,可以发现速度快了不少
mysql> CALL InsertData();
Query OK, 1 row affected (18.03 sec)
目前使用了这两个方面进行优化,还有其他方面例如,mysql认为的磁盘性能的iops的情况,以及redo log的文件大小和个数,缓冲区大小,以及其他的都是需要考虑的地方
可以发现,我们通过这样的方式优化以后,性能提升了近30倍,但是安全性降低了,要看实际的运用场景了