从网上搜寻各路大佬的部分解决方案整理而来。

一. 使用批量插入,将多条单独的 insert 合并成一次操作

即:insert into table values (a1, b1, c1), (a2, b2, c2);

解析:将多条 insert 合并后,减少MySQL日志量(即MySQL的 binlog 和 innodb 的事务日志),降低日志刷盘的数据量和频率,从而提高效率。通过合并多条 insert 语句,还能减少SQL语句的解析次数,减少和数据库的交互,减少了网络传输的IO。

二. 修改批量插入缓冲区大小参数: bulk_insert_buffer_size,调大批量插入的缓存

这个参数默认为 8M,例如设置成 100M

set global bulk_insert_buffer_size = 1024*1024*100;

三. 设置 innodb_flush_log_at_trx_commit = 0

相对于 innodb_flush_log_at_trx_commit = 1, 设置为 0 可以明显的提高导入的速度。

set global innodb_flush_log_at_trx_commit=0;

解析:

        0: log buffer 中的数据将以每秒一次的频率写入到 log file 中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的 commit 并不会触发任何的 log buffer 到 log file 的刷新或者从文件系统到磁盘的刷新操作。

        1: 在每次事务提交的时候将 log buffer 中的数据都会写入到 log file,同时也会触发文件系统到磁盘的同步;

        2: 事务提交会触发 log buffer 到 log file 的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘的同步操作。

四. 设置事务提交为 手动提交

因为 MySQL 事务默认是自动提交的(autocommit),这样每插入一条数据,都会进行一次 commit,所以通过手动提交事务,可以减少创建事务时的消耗。一般可以设置为 1000 条insert 提交一次。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐