Navicat 17 导入大 SQL 文件慢的根本原因是默认逐条提交,需在查询编辑器中手动执行 SET autocommit = 0; + 全量 SQL + COMMIT;,禁用 FOREIGN_KEY_CHECKS 和 UNIQUE_CHECKS,批量大小设为 50000,并关闭语法校验;调 max_allowed_packet 或开高亮等无效,超 800MB 文件应改用 mysql 命令行导入。
navicat 17 导入大 sql 文件慢,不是因为功能缺失,而是默认配置面向交互式操作——关掉自动提交、禁用约束、调大批量值,才能释放真实吞吐能力。
怎么让 Navicat 17 用一个事务跑完整个 SQL 文件
默认“运行SQL文件”是逐条提交,每条 INSERT 都触发一次磁盘刷写。真正提速要绕过这个机制:
- 在 Navicat 查询编辑器里手动执行:
SET autocommit = 0;,再粘贴全部 SQL 内容(不含CREATE DATABASE或USE),末尾加COMMIT; - 不能依赖“运行SQL文件”向导里的“使用事务”勾选——它只控制批内事务,不覆盖单语句提交行为
- 如果 SQL 文件本身含
BEGIN/COMMIT块,会和autocommit = 0冲突,需提前删掉或注释掉
为什么“关闭外键检查”比“删索引”更优先做
外键校验是实时的,每插一行都查关联表,而索引只是写入时多建一棵 B+ 树。禁用外键开销更低、恢复更快,且无需权限确认:
- 导入前执行:
SET FOREIGN_KEY_CHECKS = 0;和SET UNIQUE_CHECKS = 0; - 导入完成后必须立刻执行:
SET FOREIGN_KEY_CHECKS = 1;和SET UNIQUE_CHECKS = 1;,否则后续数据可能违反约束而不报错 - 注意:这不会影响主键或自增列行为,但会跳过
ON DELETE CASCADE等逻辑
批量大小设到多少才算合理
Navicat 的“每批记录数”参数(工具 → 选项 → 导入 → 每批记录数)直接影响内存占用与网络往返次数:
- 默认 1000 太小,50000 是实测较稳的阈值;超过 100000 容易触发 Navicat 自身内存溢出(尤其文件 >500MB 时)
- 该值只对纯
INSERT语句有效;若 SQL 文件混有UPDATE或ALTER TABLE,批次会被强制切开 - 配合“快速执行(不返回结果集)”模式使用,避免 Navicat 缓存每批返回的 OK 包导致卡顿
哪些设置看似有用实则无效
很多人花时间调错地方,反而掩盖了真瓶颈:
-
max_allowed_packet是 MySQL 服务端参数,Navicat 客户端不读它;调大只防“包太大报错”,不提速 - Navicat 界面里的“语法高亮”“自动完成”关掉能省一点内存,但对导入速度几乎无影响
- “压缩文件导入”只加速传输,解压+解析仍要走完整流程,不如直接用未压缩 UTF-8 文件
最常被忽略的是:Navicat 会把整个 SQL 文件加载进内存再分段执行。一旦文件超 800MB,而你机器只有 8GB 内存,Navicat 进程大概率卡死——这时候换 mysql -u root -p db_name 是唯一可靠路径。


















