要。导入前删除非主键索引可显著提速,因Navicat每插入一行均触发索引更新;需先SHOW INDEX查索引、逐个DROP INDEX,主键不可删,外键约束应临时禁用SET FOREIGN_KEY_CHECKS=0,导入后再重建索引并ANALYZE TABLE。
导入前要不要先删索引?
要。特别是主键以外的索引,导入前 drop index 能显著提速。navicat 导入时每插入一行,都会触发所有索引的更新,60 万行数据可能让导入时间从 70 秒拉长到几分钟甚至更久。
常见错误现象:导入进度条卡住、Navicat 假死、MySQL 报 Lock wait timeout exceeded。
- 执行前先查现有索引:
SHOW INDEX FROM your_table; - 逐个删除非主键索引,例如:
DROP INDEX idx_user_id ON your_table; - 主键索引(
PRIMARY)不能删,否则 Navicat 可能拒绝导入或报错ERROR 1062: Duplicate entry - 如果表有外键约束,
DROP INDEX不影响外键,但要注意后续重建索引时别漏掉关联字段
Navicat 导入时选“追加模式”还是“替换模式”?
选“追加模式”。它不会清空原表,也不会重置自增 ID,适合在已有结构上补数据——而你真正需要的是“先导入、再建索引”,不是“边建索引边导入”。
容易踩的坑:
- 误选“替换模式”:会先
TRUNCATE TABLE,连主键索引都清掉,导入后得手动重建主键(Navicat 不自动恢复) - 勾了“启用外键检查”但没关:导入大批量数据时可能因外键校验拖慢速度,建议导入前在查询窗口执行:
SET FOREIGN_KEY_CHECKS = 0;,导入完成后再设回1 - Excel 第一行被当列名,但实际字段名含空格或特殊字符(如
user name),Navicat 会自动转成反引号包裹,建索引时得注意字段名一致性
用 Navicat 图形界面建联合索引,为什么只生效第一列?
因为点了“添加索引”按钮后,只选了一列就点确定——Navicat 默认建单列索引。联合索引必须手动多选字段,且顺序不能错。
实操要点:
- 右键表 →
设计表→ 切到索引标签页 → 点+→ 输入索引名(如idx_user_status_created) - 在“字段”下拉框里,**逐个点击添加多列**:先点
user_id,再点status,再点created_at(顺序即最左前缀顺序) - 每列右侧确认排序:MySQL 5.7 及更早版本设
DESC无效,只认ASC;8.0+ 才真正支持混合方向 - 类型选
INDEX(不是UNIQUE,除非业务要求唯一性) - 建完立刻用
SHOW CREATE TABLE your_table检查 DDL,确认生成的是KEY `idx_xxx` (`user_id`,`status`,`created_at`),而不是三个单列索引
大表重建索引时锁表怎么办?
MySQL 5.6+ 默认在线加索引(ALGORITHM=INPLACE),但 Navicat 不自动加这个参数,直接执行 ALTER TABLE ... ADD INDEX 仍可能锁表几秒到几分钟,取决于数据量。
安全做法:
- 在低峰期操作,或先在从库验证语句执行时间
- 手动改 DDL:把 Navicat 生成的语句复制出来,在
ADD INDEX前加上ALGORITHM=INPLACE, LOCK=NONE(仅限 MySQL 5.6+ 支持的场景) - PostgreSQL 用户注意:Navicat 默认不加
CONCURRENTLY,必须手动补上,否则整个表被锁死 - 建完索引立刻执行:
ANALYZE TABLE your_table;,让优化器及时更新统计信息,避免刚建完索引却没走索引的情况
最易被忽略的一点:Navicat 的“显示 SQL 预览”开关默认关闭,不打开就看不到它到底生成了什么语句——你点确定那一刻,执行的就是那个没加 ALGORITHM 或没写 CONCURRENTLY 的原始 DDL。


















