MySQL插入操作优化,提升并发效率,让数据流转更顺畅

文章导读
使用INSERT IGNORE或INSERT ON DUPLICATE KEY UPDATE来避免锁冲突,提升并发插入效率。批量插入数据,使用INSERT INTO ... VALUES (...),(...),(...)形式,一次性插入多行,减少锁持有时间。关闭autocommit,使用START TRANSACTION和COMMIT包围批量插入,进一步减少事务开销。
📋 目录
  1. 1. 批量插入
  2. 2. 调整innodb_flush_log_at_trx_commit
  3. 3. 使用LOAD DATA INFILE
  4. 4. 增大innodb_log_file_size
  5. 5. 延迟主键自增
  6. 6. 分库分表或分区
A A

使用INSERT IGNORE或INSERT ON DUPLICATE KEY UPDATE来避免锁冲突,提升并发插入效率。批量插入数据,使用INSERT INTO ... VALUES (...),(...),(...)形式,一次性插入多行,减少锁持有时间。关闭autocommit,使用START TRANSACTION和COMMIT包围批量插入,进一步减少事务开销。

1. 批量插入

单个INSERT语句插入多行数据,比多次单行INSERT快很多倍。例如:INSERT INTO table_name (col1, col2) VALUES (1,'a'),(2,'b'),(3,'c'); 这样可以显著减少网络往返和锁竞争。

2. 调整innodb_flush_log_at_trx_commit

将innodb_flush_log_at_trx_commit设置为2,可以让性能提升5-10倍,但会丢失最近1秒的数据。在高并发插入场景下这是一个很好的权衡。

MySQL插入操作优化,提升并发效率,让数据流转更顺畅

3. 使用LOAD DATA INFILE

LOAD DATA INFILE是MySQL中最快的插入方式,对于大批量数据导入,速度比INSERT快几十倍。语法:LOAD DATA INFILE '/path/to/file.txt' INTO TABLE table_name FIELDS TERMINATED BY ',';

4. 增大innodb_log_file_size

innodb_log_file_size默认4M,太小了,建议调到128M甚至1G,能让插入速度提升几倍,因为减少了log的频繁切换。

MySQL插入操作优化,提升并发效率,让数据流转更顺畅

5. 延迟主键自增

如果主键不是连续的,或者担心自增锁,使用单独的自增表或Redis生成ID,避免innodb_autoinc_lock_mode=1下的锁竞争。

MySQL插入操作优化,提升并发效率,让数据流转更顺畅

6. 分库分表或分区

对于海量数据,垂直分表或水平分区,能让插入分散到多个表/库,大幅提升并发插入能力。

FAQ
Q: 批量插入多少行合适?
A: 一般1000-5000行一批,根据内存和网络测试最佳值。
Q: 关闭autocommit有风险吗?
A: 只要用事务包裹并及时commit,就没问题。
Q: LOAD DATA INFILE需要什么权限?
A: 需要FILE权限,且文件路径要服务器可读。
Q: innodb_flush_log_at_trx_commit=2安全吗?
A: 适合非核心数据,高可用场景用=1。