Navicat导入SQL文件慢的主因是默认逐条INSERT+自动提交,应勾选“手动提交”、取消“每批提交”、调大批量数至50000,并清理SQL文件中的事务封装语句。
勾选“手动提交”并关闭“每批提交”
navicat 默认对每个 insert 语句单独提交事务,导致每条语句都触发一次 redo log 写入和磁盘刷盘 —— 这是慢的主因。必须在「运行sql文件」对话框里明确控制事务边界。
- 务必勾选「手动提交(不自动提交)」:这会让 Navicat 把整个文件(或每一批)包裹在单个事务中,避免高频 I/O
- 取消勾选「每批提交」:这个选项一旦开启,Navicat 会按你设置的「每批记录数」反复 COMMIT,反而抵消手动提交效果
- 如果目标表有外键或唯一索引,建议导入前先执行
SET FOREIGN_KEY_CHECKS = 0;和SET UNIQUE_CHECKS = 0;,导入完再恢复
调大“每批记录数”但别超过 50000
Navicat 的「每批记录数」控制它把 SQL 文件切片后分段发送给 MySQL 的粒度。默认 100 或 1000 太小,频繁切片加剧网络往返和解析开销。
- 在「工具 → 选项 → 导入 → 每批记录数」中设为
50000(上限建议值) - 超过
50000可能引发客户端内存溢出,尤其当单批含大量长文本字段时 - 该值只影响 INSERT 批量插入行为;CREATE TABLE、ALTER 等 DDL 语句不受此参数控制,仍逐条执行
避免 SQL 文件自带事务封装
很多人在导出时勾选了「包含 BEGIN/COMMIT」,或手写 START TRANSACTION,结果和 Navicat 的手动提交机制冲突,导致事务嵌套失败或批处理被降级为逐行执行。
- 检查 SQL 文件头部是否含
SET AUTOCOMMIT = 0、BEGIN、COMMIT或ROLLBACK - 若有,全部删掉——Navicat 在「手动提交」模式下会自己发
BEGIN和最终COMMIT - 特别注意从其他工具(如 mysqldump --opt)导出的文件,常默认带
SET AUTOCOMMIT = 0
“遇到错误继续”不是性能开关,但影响流程稳定性
这个选项本身不提速,但它防止因 DROP TABLE IF EXISTS 报错(表不存在)或重复建索引中断整个导入,让批量提交逻辑能跑到底。
- 勾选「遇到错误继续」:跳过运行时错误(如表已存在),但**不跳过语法错误**
- 不要勾选「停止执行遇到错误时」:它是默认开启的,一报错就停,和批量提交目标直接冲突
- 若 SQL 文件含多阶段操作(如先删后插),该选项能让后续语句继续执行,避免卡在中间
DELIMITER $$、BOM 头、跨文件的临时变量依赖,或者一个 USE database_name; 插在中间切断了上下文。这些不会报明显错误,但会让 Navicat 默默降级为逐行执行。











