如何优化数据导入
- 一次插入多行的值;
- 关闭自动提交,多次插入数据的 SQL 一次提交;
- 调整参数,innodb_flush_log_at_trx_commit和 sync_binlog 都设置为0(当然这种情况可能会丢数据)。
一次插入多行的值
插入行所需的时间由以下因素决定
- 连接:30%
- 向服务器发送查询:20%
- 解析查询:20%
- 插入行:10% * 行的大小
- 插入索引:10% * 索引数
- 结束:10%
有大批量导入时,推荐一条insert语句插入多行数据
关闭自动提交
导入多条数据时,关闭自动提交,让多条 insert 一次提交,可以大大提升导入速度。关闭自动提交和一次插入多行能提高批量插入速度的原因一样,因为批量导入大部分时间耗费在客户端与服务端通信的时间,所以多条insert语句合并提交可以减少客户端与服务端通信的时间,并且合并提交还可以减少数据落盘的次数。
参数调整
影响MySQL写入速度的主要两个参数:innodb_flush_log_at_trx_commit、sync_binlog。
innodb_flush_log_at_trx_commit:控制重做日志刷新到磁盘的策略,有0 、1和2三种值。
- 0:master线程每秒把redo log buffer写到操作系统缓存,再刷到磁盘;
- 1:每次提交事务都将redo log buffer写到操作系统缓存,再刷到磁盘;
- 2:每次事务提交都将redo log buffer写到操作系统缓存,由操作系统来管理刷盘。
sync_binlog:控制binlog的刷盘时机,可配置0、1或者大于1的数字。
- 0:二进制日志从不同步到磁盘,依赖OS刷盘机制;
- 1:二进制日志每次提交都会刷盘;
- n(n>1) : 每n次提交落盘一次。
innodb_flush_log_at_trx_commit设置为0、同时sync_binlog设置为0 时,写入数据的速度是最快的。如果对数据库安全性要求不高(比如你的测试环境),可以尝试都 设置为0后再导入数据,能大大提升导入速度。