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。

相关推荐
Cc.Y2 小时前
Java零基础入门:字符串深度掌握——从基础API到StringBuilder性能优化
java·开发语言·性能优化
shuoshuohaohao7 小时前
MyBatis 小知识点
java·spring·mybatis
海上小飞龙7 小时前
【KMP算法-下篇】同一道题:Java 库函数 2600 微秒,手写 KMP 16 微秒
java·开发语言·算法
谢亮_vipxieliang8 小时前
泛型擦除、通配符与 PECS 一次讲透
java·面试
八解毒剂8 小时前
【计组】中央处理器CPU
java·开发语言·计算机组成原理
打工仔折腾 AI9 小时前
工业场景下时序库与实时计算一体化架构选型实践对比
java·开发语言·后端·python·性能优化·架构·ai agent 实战
ZealSinger9 小时前
Java虚拟线程上线后瓶颈转移到哪看三层
java·开发语言·firefox
2601_961133289 小时前
盘立方软件指标文华期货公式下载
java
蜗牛互联网9 小时前
长任务多Agent共享文件系统的Manifest交接模式
java·人工智能·后端
Sirens.9 小时前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法