ITPub博客

首页 > 数据库 > MySQL > MySQL优化插入速度的一些思路

MySQL优化插入速度的一些思路

原创 MySQL 作者:T1YSL 时间:2025-08-13 17:08:36 0 删除 编辑

尝试修改参数加快导入速度

在MySQL中,有一对“双一”参数,即 innodb_flush_log_at_trx_commit 与 sync_binlog 。为了安全性这两个参数默认值为1,为了快速导入脚本,我们可以临时修改下这两个参数,下面简单介绍下这两个参数:


innodb_flush_log_at_trx_commit默认值为1,可设置为0、1、2

如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行.该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。

如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去.

如果innodb_flush_log_at_trx_commit设置为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。


sync_binlog默认值为1,可设置为[0,N)

当sync_binlog =0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。

当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。


这两个参数可以在线修改,若想快速导入,可以按照下面步骤来操作:

# 1.进入MySQL命令行 临时修改这两个参数

set global innodb_flush_log_at_trx_commit = 2;

set global sync_binlog = 2000;


# 2.执行SQL脚本导入

mysql -uroot -pxxxxxx testdb < testdb.sql


# 3.导入完成 再把参数改回来

set global innodb_flush_log_at_trx_commit = 1;

set global sync_binlog = 1;


还有另外一种场景是你的需求是新建从库,或者是不需要产生binlog,这时候导入SQL脚本时可以设置暂时不记录binlog,可以在脚本开头增加 set sql_log_bin=0; 然后再执行导入,这样速度会进一步加快。如果你的MySQL实例没有开启binlog则不需要再执行该语句了。


比如load data或者写程序多线程插入也可加快插入速度。本文中介绍的方法只适合手动导入SQL脚本。


如下几个方法也考虑使用:

  • 使用MySQL自带的命令行工具进行导出导入。

  • 使用扩展插入方法,一个insert对于多个值。

  • 临时修改innodb_flush_log_at_trx_commit和sync_binlog参数。

  • 关闭binlog或者临时不记录binlog。

  • 其实还有一些其他方案,比如先不创建索引,插入数据后再执行添加索引操作;或者先将表改为MyISAM或MEMORY引擎,导入完成后再改为InnoDB引擎。




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69990629/viewspace-3093384/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
中国开源软件推进联盟PG分会系列技术丛书《快速掌握PostgreSQL版本新特性》一书副主编。数据库技术专家。数据库认证讲师、恩墨学院数据库讲师。擅长MySQL数据库、PostgreSQL等开源数据库。拥有MySQL-OCP 、PostgreSQL-PGCM等数据库认证。

注册时间:2020-12-12

  • 博文量
    152
  • 访问量
    160666