MySQL默认启用--extended-insert实现批量插入以提升导入效率,需配合调大max_allowed_packet、禁用自动提交;PostgreSQL用--inserts而非--column-inserts;SQLite导入前应关闭journal和同步写入。
MySQL mysqldump 导出时启用批量插入(--extended-insert)
默认情况下,mysqldump 会为每一行数据生成一条 insert 语句,导入时效率极低。开启 --extended-insert(默认已启用)能让它把多行合并成一条带多个值的 insert,显著减少 sql 解析开销。
常见错误现象:mysqldump 输出全是单行 INSERT INTO ... VALUES (...);,导入耗时翻倍甚至更久。
- 确认是否启用:执行
mysqldump --help | grep extended,看到--extended-insert (TRUE)表示默认打开 - 显式指定更稳妥:
mysqldump --extended-insert=TRUE -u user db table > dump.sql - 禁用它只在调试或兼容老版本 MySQL 时需要;否则别加
--skip-extended-insert - 注意:该选项不影响字段转义逻辑,但和
--skip-quotes等配合可能引发语法错误
关闭自动提交 + 调大 max_allowed_packet 避免导入中断
批量插入语句如果太长,会被 MySQL 拒绝——典型报错是 Got a packet bigger than 'max_allowed_packet' bytes,尤其导出大表时高频出现。
使用场景:导出含长文本、BLOB 字段或单表超百万行的数据。
- 导出前先查服务端限制:
mysql -e "SHOW VARIABLES LIKE 'max_allowed_packet';" - 临时调大(需有 SUPER 权限):
SET GLOBAL max_allowed_packet = 512*1024*1024;(512MB) - 导入时加
--force和--init-command="SET autocommit=0;",避免每条语句都提交事务 - 导入完成后手动
COMMIT;,或让脚本末尾加COMMIT;
PostgreSQL 使用 pg_dump 的 --inserts 和 --column-inserts 区别
PostgreSQL 默认导出为 COPY 语句,最快但兼容性差;改用 INSERT 语法是为了跨版本/跨平台迁移,但必须选对参数。
容易踩的坑:--inserts 生成标准批量插入(类似 MySQL 的 extended insert),而 --column-inserts 会为每条 INSERT 显式写出字段名——体积大、解析慢、几乎没优势。
- 要速度优先:用
pg_dump --inserts -d mydb > dump.sql - 避免
--column-inserts,除非目标库字段顺序不一致且无法改表结构 -
--disable-triggers在导入大表时可跳过触发器开销,但需确保业务逻辑允许 - 导入前执行
SET synchronous_commit = off;可提速,但断电可能丢数据
SQLite 导出为 INSERT 语句后如何加速导入
SQLite 原生命令 .dump 默认输出的就是批量 INSERT,但默认启用了 PRAGMA journal_mode = DELETE 和同步写入,拖慢大批量导入。
性能影响明显:不调优时,百万行导入可能比优化后慢 5–10 倍。
- 导入前加三行“加速头”:
PRAGMA journal_mode = OFF; PRAGMA synchronous = OFF; PRAGMA cache_size = 10000;
- 确保导出文件末尾没有
COMMIT;或多余空行,否则sqlite3 db.sqlite 可能卡住 - 如果导出含
CREATE TABLE,建议先建好表再导入数据,避免重复解析 DDL -
.mode insert是交互命令,不能用于脚本;批量导入必须靠外部 SQL 文件 + 上述 PRAGMA 控制










