【MySQL】MySQL提高批量insert的性能
MySQL提高批量insert的性能
从网上搜寻各路大佬的部分解决方案整理而来。
一. 使用批量插入,将多条单独的 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 提交一次。
更多推荐
所有评论(0)