批量数据导入优化

插入行所需的时间由以下因素决定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次提交落盘一次。

innodb_flush_log_at_trx_commit设置为0、同时sync_binlog设置为0时,写入数据的速度是最快的。


   转载规则


《批量数据导入优化》 wangyixin-tom 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
order/group by优化 order/group by优化
order by 原理按照排序原理分manual,MySQL 排序方式分两种: 通过有序索引直接返回有序数据:Using index 通过 Filesort 进行的排序:Using filesort Filesort是内存排序还是磁盘排
2021-03-13
下一篇 
索引失效 索引失效
函数操作对条件字段做函数操作,可能破坏了索引值的有序性,走不了索引。 select * from t1 where date(c) ='2019-05-21'; 优化:改成范围查询 select * from t1 where c>='20
2021-03-13
  目录