--extended-insert 是 mysqldump 默认启用的关键参数,启用后将多行数据合并为单条 INSERT 语句(如 INSERT INTO t VALUES (1),(2),(3)),显著减小导出文件体积并提升导入速度;未启用时每行生成一条 INSERT,导致文件臃肿、导入缓慢。
MySQL mysqldump 用 --extended-insert 是默认且关键的开关
不加这个参数,mysqldump 默认每行数据生成一条 insert 语句,导出文件大、导入慢。加上它(其实默认就开启),才会把多行数据合并进单条 insert,比如 insert into t values (1),(2),(3);。
常见错误现象:导出 SQL 文件几百 MB,但表实际才几万行——大概率是被禁用了批量插入,比如加了 --skip-extended-insert 或旧版脚本硬编码关掉了它。
- 确认是否启用:
mysqldump --help | grep extended,看到extended-insert TRUE表示默认开启 - 显式启用更稳妥:
mysqldump --extended-insert db_name table_name > dump.sql - 如果要禁用(极少见,比如兼容老系统),才需加
--skip-extended-insert
控制每条 INSERT 的行数:--net_buffer_length 和 --max-allowed-packet 共同起作用
mysqldump 不是固定每条语句塞 1000 行,而是按内存缓冲动态拼接。真正决定单条 INSERT 最大长度的是客户端的 net_buffer_length(默认 1MB),同时受服务端 max_allowed_packet 限制。
如果你发现导出的 INSERT 还是很短(比如只有十几行),不是工具问题,而是缓冲太小或字段太长(比如含 TEXT 字段)。
- 增大客户端缓冲:
mysqldump --net-buffer-length=4194304 ...(4MB) - 确保服务端允许接收大包:
mysql -e "SHOW VARIABLES LIKE 'max_allowed_packet';",导入前最好设为 ≥ 导出时的--net-buffer-length - 注意:过大的单条语句反而可能在导入时触发超时或 OOM,32KB–1MB 是较稳的范围
避免冗余开销:--skip-insert-ignore 和 --insert-ignore 的取舍
加 --insert-ignore 会让每条 INSERT 变成 INSERT IGNORE,跳过重复键冲突。但它会强制关闭批量插入优化——MySQL 在 INSERT IGNORE 模式下无法安全复用同一语句插入多行,mysqldump 会退化成单行 INSERT 或分组极小。
除非你明确需要忽略冲突且接受性能损失,否则别加它。导出后想忽略导入冲突,应该在导入时用 mysql --force 或提前 TRUNCATE 表。
- 默认行为是普通
INSERT,支持批量 -
--insert-ignore→ 单行或极小组,文件变大、导入变慢 -
--replace同样禁用批量插入,原理类似,也慎用
导出后还能再压缩?别只盯着 SQL 格式
即使启用了 --extended-insert,纯文本 SQL 仍有大量重复关键字(INSERT INTO ... VALUES )。这时候直接 gzip 压缩比改 SQL 格式收益更大——通常能压到原大小 15%–25%。
但要注意:压缩后无法用 mysql 直接导入,得先解压;如果管道导入,必须用 zcat 或 gunzip -c 配合。
- 推荐组合:
mysqldump --extended-insert --net-buffer-length=2097152 db tbl | gzip > dump.sql.gz - 导入时:
zcat dump.sql.gz | mysql db - 别用
--compact:它只是删空行和注释,对体积影响微乎其微,还牺牲可读性
真正影响最终体积和速度的,是批量插入机制是否生效、缓冲是否合理、以及是否做了基础压缩。其它花哨选项,基本都是干扰项。










