MySQL-05丨如何优化数据导入

Posted by jiefang on October 28, 2019

如何优化数据导入

  • 一次插入多行的值;
  • 关闭自动提交,多次插入数据的 SQL 一次提交;
  • 调整参数,innodb_flush_log_at_trx_commitsync_binlog 都设置为0(当然这种情况可能会丢数据)。

一次插入多行的值

插入行所需的时间由以下因素决定

  • 连接:30%
  • 向服务器发送查询:20%
  • 解析查询:20%
  • 插入行:10% * 行的大小
  • 插入索引:10% * 索引数
  • 结束:10%

有大批量导入时,推荐一条insert语句插入多行数据

关闭自动提交

导入多条数据时,关闭自动提交,让多条 insert 一次提交,可以大大提升导入速度。关闭自动提交和一次插入多行能提高批量插入速度的原因一样,因为批量导入大部分时间耗费在客户端与服务端通信的时间,所以多条insert语句合并提交可以减少客户端与服务端通信的时间,并且合并提交还可以减少数据落盘的次数。

参数调整

影响MySQL写入速度的主要两个参数:innodb_flush_log_at_trx_commitsync_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后再导入数据,能大大提升导入速度。