Navicat执行计划里的`key`和`possible_keys`有何区别?

P粉602998670

P粉602998670

2026-06-27

815人浏览

原创

key 为 NULL 但 possible_keys 有值,说明优化器识别到索引却主动放弃,常见于选择性低、统计信息过期、未用最左前缀或成本误判,实际执行多为全表或索引全扫描,性能风险高。

key 为 NULL 但 possible_keys 有值,说明什么

这代表 mysql 优化器「看得到」索引(possible_keys 非空),但主动放弃了它。常见原因包括:索引选择性太低、统计信息过期、查询条件未覆盖索引最左前缀、或优化器误判成本更低。此时 key 显示为 null,实际执行大概率是 type: all(全表扫描)或 type: index(索引全扫描),性能风险明确。

  • 检查 WHERE 条件是否用上了联合索引的最左字段,比如索引是 (a,b,c),但查询只写了 WHERE b = ?,那该索引不会被选中
  • 运行 ANALYZE TABLE table_name; 更新统计信息,尤其在大批量 INSERT/DELETE 后
  • FORCE INDEX 临时验证:如果加了强制索引后 rows 显著下降,说明优化器判断有偏差

possible_keys 有多个,key 只选一个,怎么判断它挑得对不对

possible_keys 是候选池,key 是最终拍板的那一个。优化器依据的是「预估扫描行数 rows」和「索引访问成本」,但它不考虑缓存、IO 延迟或并发竞争——这些现实因素常导致它选错。

  • 对比各候选索引的 key_len:若 key_len 远小于索引定义长度(比如联合索引 (a,b,c) 总长 20 字节,但 key_len = 5),说明只用了第一个字段 a,后续字段没生效,可能不如另一个更窄的单列索引
  • 观察 Extra 列:出现 Using filesortUsing temporary 时,即使 key 不为 NULL,也意味着排序/分组无法走索引,应优先优化这部分
  • EXPLAIN FORMAT=JSON 查看 used_columnsrange_analysis,比传统格式更能暴露优化器权衡过程

key 和 possible_keys 都为空,是不是一定没建索引

不一定。更可能是以下情况:

navicat for mysql 破解版
navicat for mysql 破解版

优秀的mysql数据库远程管理工具

下载
  • 查询字段根本不在任何索引里(比如 WHERE status + 1 = 5 这种表达式计算,会跳过索引)
  • 对索引字段用了函数或类型隐式转换,例如 WHERE DATE(create_time) = '2026-06-01'WHERE user_id = '123'user_idINT 类型)
  • 表使用了不支持索引下推的存储引擎(如 MyISAM 对部分 LIKE '%abc' 无效),或 MySQL 版本太老(
  • SELECT * 查询主键表时,优化器可能直接走聚簇索引全扫描,不显示 key(但 typeindex,不是 ALL

key_len 值比预期小,为什么联合索引没全用上

key_len 是优化器实际使用的索引字节数,它严格按「最左前缀匹配」和「字段是否允许 NULL」计算。值偏小,基本等于只用到了联合索引开头的一两个字段。

  • 确认 WHERE 中是否跳过了中间字段:索引 (a, b, c),查询 WHERE a = 1 AND c = 3b 缺失,c 不会走索引
  • 注意数据类型:VARCHAR(255) 字段在 UTF8MB4 下最多占 1020 字节,但 key_len 只算实际存储长度 + 2 字节长度头;而 CHAR 是定长,key_len 固定
  • NULL 字段额外占 1 字节:如果索引字段定义为 name VARCHAR(50) NULL,那它比 NOT NULL 多 1 字节,key_len 会体现出来
真正难的不是看懂这两列,而是当 keypossible_keys 不一致时,得快速判断是索引设计问题、查询写法问题,还是优化器本身的局限——这时候别光盯着 EXPLAIN 输出,直接查 information_schema.STATISTICS 看索引基数,或者用 sys.schema_index_statistics(MySQL 5.7+)看真实命中率。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

navicat

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

2451

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

448

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

614

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3968

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

1344

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

3561

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

3490

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

641

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

526

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程