插入行所需的时间由以下因素决定[https://dev.mysql.com/doc/refman/5.7/en/insert-optimization.html](mysql manual)
- 连接:30%
- 向服务器发送查询:20%
- 解析查询:20%
- 插入行:10% * 行的大小
- 插入索引:10% * 索引数
- 结束:10%
一次插入多行的值
有大批量导入时,推荐一条insert语句插入多行数据。
原因:减少服务器通信时间
关闭自动提交
Autocommit 开启时会为每个插入执行提交。可以在InnoDB导入数据时,关闭自动提交。
原因:合并提交可以减少客户端与服务端通信的时间,减少数据落盘的次数。
参数调整
innodb_flush_log_at_trx_commit:控制重做日志刷新到磁盘的策略
- 0:master线程每秒把redo log buffer写到操作系统缓存,再刷到磁盘;
- 1:每次提交事务都将redo log buffer写到操作系统缓存,再刷到磁盘;
- 2:每次事务提交都将redo log buffer写到操作系统缓存,由操作系统来管理刷盘。
sync_binlog:控制binlog的刷盘时机
- 0:二进制日志从不同步到磁盘,依赖OS刷盘机制;
- 1:二进制日志每次提交都会刷盘;
- n(n>1) : 每n次提交落盘一次。
innodb_flush_log_at_trx_commit设置为0、同时sync_binlog设置为0时,写入数据的速度是最快的。