CSV写入MySQL速度过慢,如何提升批量写入效率?
提升MySQL批量写入速度的实用方案
针对你遇到的CSV转存MySQL时写入慢、超时的问题,我分享几个实战中验证有效的优化方法,按优先级从高到低排列:
直接用MySQL原生的
LOAD DATA INFILE导入
这是最快的方式,比自己写代码循环插入效率高几个数量级。它跳过了应用层的逐条处理,直接从文件读取数据写入表。示例语句:LOAD DATA LOCAL INFILE '/path/to/your/data.csv' INTO TABLE your_target_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS; -- 如果CSV首行是表头的话忽略注意要确保MySQL开启了
local_infile参数(可以用SET GLOBAL local_infile = 1;临时开启),并且你的数据库用户有FILE权限。批量插入代替单条插入
如果因为某些原因不能用LOAD DATA,那一定要把多条数据打包成一个INSERT语句。比如把原来的:INSERT INTO table (col1, col2) VALUES (val1, val2); INSERT INTO table (col1, col2) VALUES (val3, val4);改成:
INSERT INTO table (col1, col2) VALUES (val1, val2), (val3, val4), ...; -- 一次插500-1000条都可以这样能大幅减少数据库的连接开销和事务提交次数。
关闭自动提交,用事务批量提交
MySQL默认每条语句自动提交事务,这会产生大量的磁盘IO。可以先关闭自动提交,批量插入后再一次性提交:SET autocommit = 0; -- 执行N条批量插入语句 COMMIT;临时调整MySQL配置提升写入效率
针对InnoDB引擎(现在大部分都是用它),可以临时修改几个参数:- 增大
innodb_buffer_pool_size:让更多数据在内存中处理,减少磁盘读写(比如设为服务器内存的50%-70%) - 调大
innodb_log_file_size和innodb_log_buffer_size:提升事务日志的写入效率 - 临时设置
innodb_flush_log_at_trx_commit = 2:默认是1,每次提交都刷到磁盘,设为2是每秒刷一次,速度会快很多,但注意如果服务器断电可能丢失1秒内的数据,导入完成后改回1即可
- 增大
临时禁用索引和约束
插入数据时,MySQL会实时维护索引和外键约束,这会拖慢速度。可以先禁用它们,导入完成后再恢复:-- 禁用外键检查 SET FOREIGN_KEY_CHECKS = 0; -- 禁用非唯一索引(MyISAM用ALTER TABLE ... DISABLE KEYS; InnoDB会自动优化) ALTER TABLE your_table DISABLE KEYS; -- 执行导入操作 -- 恢复设置 ALTER TABLE your_table ENABLE KEYS; SET FOREIGN_KEY_CHECKS = 1;检查代码层面的低效操作
比如有没有每次插入都重新创建数据库连接?一定要复用连接;如果用了预处理语句,要复用预处理对象,不要每次插入都重新prepare;另外,避免在插入循环里做不必要的计算或日志输出,这些都会拖慢整体速度。
内容的提问来源于stack exchange,提问作者Hüseyin Çiftçi
相关产品推荐
相关产品推荐

