禁用 autocommit 并手动包裹事务:执行 SET autocommit = 0; 后粘贴纯数据脚本,末尾加 COMMIT;,删除脚本中已有 START TRANSACTION/COMMIT;用“运行SQL文件”而非“新建查询”,取消语法验证、选快速执行;拆分 DDL/DML 脚本,先建表再导入数据;导出时选“扩展插入语句”格式并设批量大小 1000–5000。
禁用 autocommit 并手动包裹事务
navicat 默认每执行一条 insert 就提交一次,导致大量磁盘 i/o 和日志刷盘,这是大脚本导入慢的主因。必须绕过这个默认行为。
- 在 Navicat 查询编辑器中,先执行
SET autocommit = 0; - 紧接着粘贴你的纯数据脚本(确保不含
CREATE DATABASE、USE或存储过程定义) - 脚本末尾必须加
COMMIT;,否则数据不会落库 - 如果脚本里已有
START TRANSACTION或COMMIT,需全部删掉,避免嵌套事务冲突
注意:该方式对内存要求更高,500MB 以上脚本建议改用命令行工具,Navicat 容易卡死或断连。
用“运行SQL文件”而非“新建查询”粘贴
把整个 SQL 文件拖进查询窗口再执行,会触发 Navicat 全量语法校验和对象解析,几百万行的文件光加载就卡住。正确路径是走专用入口。
- 菜单栏 →
文件→运行SQL文件 - 务必取消勾选
执行前验证SQL语法 - 执行模式选
快速执行(不返回结果集) - 目标 Schema 必须提前选准,不能依赖脚本里的
USE xxx
这个操作跳过客户端预处理,让 MySQL 服务端直接解析执行,实测可减少 60%+ 初始化耗时。
拆分 DDL 和 DML:先建表再灌数据
一个包含 CREATE TABLE 和百万级 INSERT 的混合脚本,在 Navicat 里执行时会反复重建元数据缓存,还可能因 DDL 锁阻塞后续插入。
- 用文本工具(如 VS Code 或 Notepad++)把原始 SQL 拆成两份:
schema.sql(只留建表、索引语句)和data.sql(只留INSERT INTO ... VALUES (...)) -
schema.sql用“运行SQL文件”执行,确认表存在且引擎为InnoDB -
data.sql执行时勾选忽略错误继续执行,并设批量大小为50000 - 导入前临时删掉目标表所有索引,导入完成后再重建,能提速 2–3 倍
别省这一步——混合脚本看着省事,实际是性能黑洞。
导出时就选“扩展插入语句”格式
如果你是从 Navicat 导出再导入(比如迁移场景),导出设置直接影响后续导入速度。默认的“完整插入语句”是一行一 INSERT,而“扩展插入语句”是单条 INSERT 带多值,执行效率差一个数量级。
- 导出向导 → “记录”选项卡 → 选择
扩展插入语句 - 批量大小建议设为
1000~5000行/条,太大容易超max_allowed_packet - 导出前关闭目标表所有非必要索引,尤其是全文索引和唯一约束
- 导出编码统一用
UTF8MB4,避免导入时乱码重试
真正影响最终耗时的,往往不是导入那一刻,而是导出时你随手点的那个单选框。











