“批量插入如何更快”取决于你使用的数据库 / 中间件 / 场景,但核心思路是高度一致的。下面从通用原则 → 分数据库实践 → 常见坑三个层面说明。
❌ 一条一条 INSERT
✅ 一次插入多行
-- 慢
INSERT INTO t VALUES (1);
INSERT INTO t VALUES (2);
-- 快
INSERT INTO t VALUES (1),(2),(3),...;
经验值:单批 500~5000 行通常最优(太少没意义,太大易锁表)
ALTER TABLE ... DISABLE KEYS)autocommitbinlog / redo 压力(仅限导入场景)START TRANSACTION;
-- 插入 N 条
COMMIT;
❌ 每条都提交
✅ 每 1000~5000 条提交一次
插入前:
ALTER TABLE t DISABLE KEYS;
-- 插入
ALTER TABLE t ENABLE KEYS;
(MySQL MyISAM 特别有效,InnoDB 效果有限)
INSERT INTO ... VALUES (),(),()LOAD DATA INFILE(最快)LOAD DATA INFILE 'data.csv'
INTO TABLE t
FIELDS TERMINATED BY ',';
innodb_buffer_pool_size
innodb_log_file_size
COPY(最快)COPY t FROM 'data.csv' WITH CSV;
INSERT ... VALUES (),()unlogged 表(导入后转 logged)INSERT ALLINSERT ALL
INTO t VALUES (1)
INTO t VALUES (2)
SELECT 1 FROM dual;
SQL*LoaderAPPEND hint(直接路径插入)Pipelinepipe = r.pipeline()
for k, v in data:
pipe.set(k, v)
pipe.execute()
_bulk API❌ 在插入时建索引
❌ 使用 ORM 单条 save
❌ 每插入一条就查一次
❌ 大事务锁表
❌ 批量过大导致 OOM
文件导入 + 禁用索引 + 事务批量 + 合理批大小
如果你是:
可以告诉我具体技术栈和数量级(如 1000 万行),我可以直接给你可落地代码方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。