Navicat卡在“正在获取行数”是因默认启用「自动获取行数」功能,后台执行SELECT COUNT(*)触发大表全表扫描;关闭路径为工具→选项→常规→取消勾选“自动获取行数”,设置即时生效且不影响其他功能。
Navicat 执行 SQL 为什么卡在“正在获取行数”
不是 sql 本身慢,而是 navicat 默认开启的「自动获取行数」功能在后台偷偷执行 select count(*)。这个动作对大表(尤其没主键或没索引的表)会触发全表扫描,耗时可能远超你原本那条 select 语句本身。
常见现象:点开一张百万级数据的表,界面卡住几秒到几十秒,状态栏显示“正在获取行数”,而你根本不需要这个总数;或者执行一条带 LIMIT 20 的查询,却等了 15 秒才出结果——大概率是它在背后算总行数。
- 该功能默认开启,位置在:
工具 → 选项 → 常规 → 自动获取行数 - 影响范围:所有表格浏览、右键“打开表”、甚至部分
SELECT查询结果页的顶部统计栏 - MySQL 8.0+ 尤其明显,因为
INFORMATION_SCHEMA.TABLES的TABLE_ROWS字段不再实时准确,Navicat 会退而求其次走COUNT(*) - 云数据库(如阿里云 RDS、腾讯云 CDB)常限制
COUNT(*)频率或直接拒绝,导致 Navicat 反复重试、超时、最终假死
怎么关掉“自动获取行数”并验证效果
关闭后,表上方的“共 XXX 行”消失,但所有查询、编辑、导出功能完全不受影响——你只是不看那个不准还费资源的数字了。
- 路径:
工具 → 选项 → 常规,取消勾选自动获取行数 - 无需重启 Navicat,设置立即生效;已打开的表标签页需手动刷新(F5)或重新打开
- 验证是否生效:打开一个大表,观察状态栏是否跳过“正在获取行数”,直接加载前 1000 行(或你设的
Limit results to值) - 如果仍卡,检查是否误启用了
显示表行数(在对象窗格中)(同一选项页下方),这个也建议关掉
关掉之后要注意什么
这不是个“省略功能”,而是去掉一个常被误用的性能陷阱。但得清楚它带来的行为变化:
- 对象窗格(左侧数据库树)里,表名后面不再显示行数,比如
users (1,248,932)变成纯users - 结果页顶部不再有“共 XXX 行”提示,但实际返回行数仍清晰显示在状态栏右下角(如
1000 rows returned) - 如果你真需要估算行数,手动运行
SELECT TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'db_name' AND TABLE_NAME = 'table_name';,注意这只是采样估算值 - 别和
Limit results to混淆:后者控制结果集最多取多少行,关不关“自动获取行数”都不影响它
为什么 MySQL 8.0 用户更容易踩这个坑
MySQL 8.0 废弃了 MyISAM 的精确 TABLE_ROWS,InnoDB 的该字段改由采样估算,且默认关闭 innodb_stats_on_metadata。Navicat 检测到这个值不可靠后,就强制 fallback 到 COUNT(*) ——而你连 SHOW CREATE TABLE 都没写,它已经默默帮你扫完一遍全表了。
最麻烦的是,这个行为不报错、不弹窗、不写日志,只在状态栏闪一下“正在获取行数”,然后你就以为是网络或服务器问题,开始调 wait_timeout、查慢日志、怀疑索引失效……其实只要关掉那个勾选框,世界立刻清静。


















