IDEA 控制台打印 Explain 问题排查(RestfulBox版)

目录

  • 问题排查
  • 知识扩展
    • [1. -javaagent:...\mysql-explain-agent-1.2.0-with-dependencies.jar](#1. -javaagent:...\mysql-explain-agent-1.2.0-with-dependencies.jar)
    • [2. -Dmysql.showSQL=false](#2. -Dmysql.showSQL=false)
    • [3. -Dmysql.showSQL.filter=](#3. -Dmysql.showSQL.filter=)
    • [4. -Dmysql.explain.filter=INSERT,UPDATE,DELETE](#4. -Dmysql.explain.filter=INSERT,UPDATE,DELETE)
    • [5. -Dmysql.explain.types=ALL](#5. -Dmysql.explain.types=ALL)
    • [6. -Dmysql.explain.extras=Using filesort,Using temporary](#6. -Dmysql.explain.extras=Using filesort,Using temporary)

问题排查

问题描述:在近期更新 idea 插件并重启 idea 后,启动项目疯狂打印 explain 日志,项目中未配置但仍然打印。

原因分析:

  • 安装了插件 RestfulBox,在近期更新为版本 6.10.0 后,默认启用 Explain 日志

解决方案:idea -> Settings -> RestfulBox -> Java Tool -> MySQL EXPLAIN -> 取消勾选启用

知识扩展

shell 复制代码
"-javaagent:C:\Users\***\AppData\Roaming\JetBrains\IntelliJIdea2024.3\plugins\RestfulBox\lib\mysql-explain-agent-1.2.0-with-dependencies.jar"
"-Dmysql.showSQL=false"
"-Dmysql.showSQL.filter="
"-Dmysql.explain.filter=INSERT,UPDATE,DELETE"
"-Dmysql.explain.types=ALL"
"-Dmysql.explain.extras=Using filesort,Using temporary"

配置说明:

1. -javaagent:...\mysql-explain-agent-1.2.0-with-dependencies.jar

  • 作用:以 Java Agent 方式挂载一个字节码增强代理。

  • 功能:该 Agent 会拦截应用中所有 JDBC 执行的 SQL 语句,并根据后续配置决定是否:

    • 打印原始 SQL
    • 自动执行 EXPLAIN 分析执行计划
    • 过滤特定类型的 SQL
  • 来源 :这是 RestfulBox 插件 (一款 IDEA 中用于 API 调试和数据库分析的工具)自带的诊断模块,仅在开发阶段通过 IDEA 启动时生效,不影响生产部署。

✅ 本质:一个开发辅助工具,用于实时分析 SQL 性能。


2. -Dmysql.showSQL=false

  • 作用关闭 SQL 打印

  • 说明 :

    • 如果设为 true,会在控制台打印所有被拦截的 SQL 语句。
    • 设为 false 后,既不打印 SQL,也不执行 EXPLAIN(因为 EXPLAIN 是基于 SQL 触发的)。
  • 这是最直接关闭 EXPLAIN 日志的方式

💡 即使其他 explain.* 配置存在,只要 showSQL=false,就不会做任何分析。


3. -Dmysql.showSQL.filter=

  • 作用 :设置 SQL 打印的过滤规则(排除某些 SQL)

  • 格式 :逗号分隔的关键词列表,如 QRTZ_,COUNT(0)

  • 当前值为空 :表示 不过滤任何 SQL (但因为 showSQL=false,此配置实际未生效)。

  • 示例:

  • 若设为 QRTZ_,则包含 QRTZ_ 的 SQL(如 Quartz 表查询)不会被打印或分析。


4. -Dmysql.explain.filter=INSERT,UPDATE,DELETE

  • 作用跳过对指定类型 SQL 的 EXPLAIN 分析

  • 原理 :

    • EXPLAIN 只对 SELECT 有效,对 INSERT/UPDATE/DELETE 执行会报错或无意义。
    • 此配置表示:遇到这三类语句,不执行 EXPLAIN
  • 注意 :

    • SELECT 不在此列表中 → 所有 SELECT 仍会被分析(前提是 showSQL=true)。

    • 如果你想完全关闭 EXPLAIN,应设为:

      bash 复制代码
      -Dmysql.explain.filter=SELECT,INSERT,UPDATE,DELETE

      或更简单:直接用

      bash 复制代码
      -Dmysql.showSQL=false

5. -Dmysql.explain.types=ALL

  • 作用只对执行计划中 type 列满足条件的 SQL 输出警告或高亮

  • 可选值(MySQL EXPLAIN 的 type 字段):

    • system < const < eq_ref < ref < range < index < ALL
    • ALL 表示全表扫描(性能最差)
  • 当前值 ALL :表示 只要执行计划中出现 type=ALL,就标记为需优化

  • 用途:帮助开发者快速发现全表扫描的慢查询。

⚠️ 此配置 不影响是否执行 EXPLAIN,只影响分析结果的判断逻辑。


6. -Dmysql.explain.extras=Using filesort,Using temporary

  • 作用只对执行计划中 Extra 列包含指定内容的 SQL 发出警告

  • 常见 Extra 值:

    • Using filesort:需要额外排序(无索引支持 ORDER BY)
    • Using temporary:使用临时表(常见于 GROUP BY + ORDER BY 不一致)
    • 这两者通常意味着 性能瓶颈
  • 当前配置:当 EXPLAIN 结果包含这两项时,工具会高亮提示。

⚠️ 同样,此配置 仅用于分析结果过滤,不控制是否执行 EXPLAIN

相关推荐
树若逝花若殇4 分钟前
基于Spring AOP优雅记录请求响应日志
java·spring boot
Yyyyyy~30 分钟前
【java】数组的定义和使用
java
麻辣布丁31 分钟前
java集合篇面试模拟
java·开发语言·面试
niucloud-admin33 分钟前
JAVA V6 多商户商城 开发文档——插件开发规范
java·开发语言
嘟哩DuliDuli1 小时前
创作 Agent 的任务状态该如何保存
android·java·javascript
wdfk_prog1 小时前
lely-canopen-rtt:为什么推荐在 RT-Thread 上使用 Lely CANopen 构建主站
java·运维·缓存·docker·容器
Token掘金室1 小时前
JSON模式结构化输出报错
java·服务器·json
秋饼1 小时前
Spring AI 2.0 接入 DeepSeek V4.1 Flash 生产级实战
java·ai·技术分享·后端开发
IT枫斗者枫哥1 小时前
Java 分批导出仍然 OOM?用 32 MiB 堆复现三种 CSV 写法
java
shehuiyuelaiyuehao1 小时前
算法43,外观数列,模拟算法+双指针
java·算法