用 LOAD DATA LOCAL INFILE 替代逐行 INSERT 可大幅提升导入速度,关键在于绕过 Navicat GUI 解析层、启用 local_infile、禁用索引与外键检查、调整批量提交参数,并优先考虑命令行 mysql 工具。
Navicat 默认导入 SQL 文件时,会把每个 INSERT 语句当独立事务执行,尤其面对百万级数据时,I/O 和事务开销极大。真正提速的关键是绕过 Navicat 的 GUI 解析层,让 MySQL 直接读取文件。
操作前先确认 MySQL 服务端已启用 local_infile(SHOW VARIABLES LIKE 'local_infile'; 返回 ON),再在 Navicat 中执行如下语句:
LOAD DATA LOCAL INFILE '/path/to/data.csv' INTO TABLE your_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'n' IGNORE 1 ROWS;
注意:LOCAL 表示文件路径在客户端(即 Linux 本机),不是数据库服务器;路径必须是 Navicat 进程可读的绝对路径,不能用 ~ 或相对路径。
ERROR 1148: The used command is not allowed with this MySQL version,说明 MySQL 禁用了 local_infile,需在服务端配置中设 local_infile=ON 并重启 mysqldutf8mb4),否则中文变 ?有索引的表每插入一行都要更新 B+ 树,导入速度可能下降 5–10 倍。Navicat 本身不提供“暂停索引更新”开关,得手动干预。
在 Navicat 的查询窗口中,按顺序执行:
SET FOREIGN_KEY_CHECKS = 0;SET UNIQUE_CHECKS = 0;ALTER TABLE your_table DISABLE KEYS;
等导入完成后再恢复:
ALTER TABLE your_table ENABLE KEYS;SET UNIQUE_CHECKS = 1;SET FOREIGN_KEY_CHECKS = 1;
DISABLE KEYS 只对 MyISAM 表生效;InnoDB 表需靠关闭唯一/外键检查 + 批量提交来提速ANALYZE TABLE your_table; 更新统计信息,避免后续查询走错执行计划CREATE INDEX,拖慢目标端导入Linux 版 Navicat(v16+)在导入设置里隐藏了一个关键选项:「每 X 行提交一次」。默认是 1 行,等于关掉了批量能力。
导入时点击「高级」→ 找到「提交记录数」,设为 10000 或 50000(根据内存和事务日志大小权衡):
max_allowed_packet 或填满 undo log10000,观察 Navicat 进程内存占用是否稳定(top -p $(pgrep -f "Navicat"))同时确认「遇到错误时继续」已勾选——避免某一行脏数据导致整批中断。
对超大 SQL 文件(>200MB),Linux 下直接用终端跑 mysql 命令,比 Navicat GUI 快 2–5 倍,且无界面渲染开销。
在终端执行:
mysql -h host -u user -p database_name
或更稳的方式(带进度和错误定位):
pv /path/to/large.sql | mysql -h host -u user -p database_name 2>&1 | grep -E "(ERROR|Warning)"
pv 可显示实时吞吐速率(需 sudo apt install pv)SET autocommit=0; 和结尾加 COMMIT;,否则默认每句都自动提交CREATE DATABASE 或 USE,要提前删掉,否则可能报 ERROR 1044
真正影响速度的从来不是 Navicat 图形界面有多好看,而是你有没有跳过它默认的保守执行路径——批量提交、索引控制、本地加载、命令行绕过,四者选其二,基本就能甩开默认导入好几倍。最常被忽略的是:Linux 下 Navicat 进程默认没开大内存,ulimit -v 限制可能卡死大文件解析,这点连最新文档都不提。