navicat“每批记录数”仅控制导入时sql分片粒度,设为50000可减少i/o但需配合mysql端max_allowed_packet调大、禁用sql文件中的事务封装及勾选“手动提交”才能真正提速。

直接调大 Navicat 16 的“每批记录数”或勾选“手动提交”就能显著提速,但必须配合 MySQL 服务端参数调整和 SQL 文件预处理,否则客户端设置再激进也会被 max_allowed_packet 或事务日志撑爆。
为什么改 Navicat 的“每批记录数”不等于提速
Navicat 默认每批 100 条 INSERT,频繁提交导致 redo log 刷盘太密;设为 50000 后单次事务变大,I/O 次数下降。但这个值不是越大越好:
- 超过
50000容易触发客户端内存溢出,尤其字段含TEXT或BLOB - 若 SQL 文件里有
BEGIN/COMMIT封装,Navicat 会降级为逐行执行,每批记录数失效 - 该参数只影响
INSERT,对CREATE TABLE或ALTER INDEX无作用
必须同步调大的 MySQL 服务端参数
SET GLOBAL max_allowed_packet = 512M 在 Navicat 里执行是临时的,重启 MySQL 后失效。真正生效要改配置文件:
- 确认配置路径:
SHOW VARIABLES LIKE 'config_file'; - 在
[mysqld]段下写:max_allowed_packet = 512M(单位必须是大写 M,不能写mb或512*1024*1024) - Linux systemd 环境优先改
/etc/mysql/mysql.conf.d/mysqld.cnf;Windows 改C:\ProgramData\MySQL\MySQL Server X.X\my.ini - 顺带调大
innodb_log_file_size = 512M,避免大批量写入时日志轮转卡住
SQL 文件必须做三件事预处理
原始 mysqldump 出来的文件几乎肯定要改,否则 Navicat 会默默退化成低效模式:
- 删掉所有
BEGIN TRANSACTION、COMMIT、DELIMITER—— 它们和 Navicat 的“手动提交”冲突 - 用
--skip-extended-insert重导:把INSERT INTO t VALUES (1),(2),(3)拆成单行,减小单语句体积,绕过max_allowed_packet限制 - 拆分大文件:用
split -l 1000000 data.sql chunk_(Linux)或 Python 脚本按 INSERT 行数切分,单个文件控制在 ≤50MB
运行时关键勾选项和避坑点
在 Navicat 的「运行SQL文件」对话框里,以下设置缺一不可:
- 勾选「手动提交(不自动提交)」:让整个文件或每一批包裹在单事务中
- 取消勾选「每批提交」:否则它会按你设的 50000 再强制 COMMIT,白调
- 勾选「遇到错误继续」:跳过重复主键、表已存在等非致命错误,保证流程跑到底
- 取消勾选「执行前验证SQL语法」:超大文件解析校验极耗时,关掉后直接交由 MySQL 执行
- 路径含中文或空格?Navicat 可能静默失败——文件名用英文+下划线,如
orders_data_202610.sql
最常被忽略的是 SQL 文件里的 BOM 头和跨文件依赖:一个没配对的 DELIMITER $$ 或中间插了 USE db_name;,Navicat 就会中断上下文,后续全变成逐行执行,速度掉回原点。











