Navicat自身不直接显示JSON字段索引使用情况,需手动执行EXPLAIN SELECT...,重点看type是否为ref/range且key显示虚拟列索引名;若key为NULL,说明未走索引,常见于未建函数索引或虚拟列为VIRTUAL而非STORED。
怎么看 JSON 字段是否走索引
navicat 自身不直接显示 json 字段的索引使用情况,真正起作用的是 mysql 的 explain 执行计划。你得在 navicat 查询编辑器里手动执行 explain select ...,然后重点看 type 和 key 列:type 是 ref 或 range(不是 all),且 key 显示你建的虚拟字段索引名,才说明 json 路径提取+索引生效了。
常见误区是只看 Navicat 的“查询分析器”页面——它只汇总慢查询日志和进程列表,不解析执行计划。别指望点几下就自动告诉你 JSON 查询有没有用索引。
- 如果
EXPLAIN中key为NULL,大概率是用了json_extract()或->操作符但没配函数索引 - MySQL 8.0.22+ 支持对
json_extract(col, '$.field')直接建函数索引;5.7/8.0 早期版本必须先建虚拟列再索引 - Navicat 表设计器里勾选“虚拟”并填表达式如
json_extract(`params`, '$.item_id'),保存后才能在SHOW INDEXES里看到对应索引
为什么 Navicat 查询分析器里看不到 JSON 查询的详细耗时
Navicat 的“查询分析器”依赖 MySQL 的慢查询日志(slow_query_log)或性能模式(performance_schema)。但默认情况下,含 json_extract、-> 的语句即使执行慢,也可能不被记录进慢日志——因为 MySQL 认为解析 JSON 的 CPU 开销不计入“查询时间”,只算 IO 和锁等待。
解决办法是强制开启更细粒度的监控:
- 在 MySQL 配置中启用
log_queries_not_using_indexes = ON,能捕获没走索引的 JSON 查询 - 用
SELECT * FROM performance_schema.events_statements_history_long WHERE sql_text LIKE '%json%'查最近执行过的 JSON 相关语句及其timer_wait(纳秒级真实耗时) - Navicat 的“进程列表”里能看到运行中的 JSON 查询,但仅显示
Time(秒级),精度不够判断是解析慢还是磁盘慢
JSON 嵌套深导致卡顿,怎么用 Navicat 快速定位
当 JSON 字段嵌套超过 3 层(比如 data.items[0].details.meta.tags[1]),Navicat 查询编辑器本身可能在语法高亮或自动补全阶段就卡住——这不是数据库慢,而是客户端解析 SQL 文本时正则匹配崩溃。
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
实操建议:
- 临时禁用 Navicat 的“代码自动完成”:设置 → 工具选项 → 编辑器 → 取消勾选“启用代码自动完成”
- 避免在查询里写多层路径提取,改用子查询拆解:先
SELECT json_extract(data, '$.items') AS items FROM t,再对结果集二次处理 - 用 Navicat 的“导出”功能把 JSON 字段单独导出为文件,用 VS Code + JSON 插件人工检查结构,比在 Navicat 里硬读高效得多
虚拟列索引建好了,但 Navicat 还是查得慢?
建完虚拟列和索引只是第一步。MySQL 对 JSON 虚拟列有隐式限制:只有定义为 STORED(非 VIRTUAL)的列才能被优化器用于排序(ORDER BY)和分组(GROUP BY),而 Navicat 默认建的是 VIRTUAL 类型。
验证方式:
- 执行
SHOW CREATE TABLE t,确认虚拟列定义末尾是AS (json_extract(...)) STORED,不是VIRTUAL - 如果仍是
VIRTUAL,需用ALTER TABLE t ADD COLUMN item_id INT AS (json_extract(params, '$.item_id')) STORED重建 -
STORED列会占用磁盘空间,但支持索引+排序+分组;VIRTUAL节省空间但仅支持 WHERE 条件
真正容易被忽略的是:Navicat 表设计器 UI 里勾选“虚拟”时,根本没提供 STORED/VIRTUAL 切换开关——你必须手写 ALTER TABLE 语句才能启用完整能力。


















