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

相关推荐
A Everyman19 小时前
Java 高效生成 Word 文档:poi-tl 的使用
java·pdf·word·poi-tl
短剑重铸之日19 小时前
深入理解Sentinel: 01 一次服务雪崩问题排查经历
java·sentinel·降级熔断
y = xⁿ19 小时前
重生之我创作出了小红书:计数模块 SDS 位图分片与偏移 异步发送
后端·kafka·intellij-idea
马猴烧酒.19 小时前
【面试八股|操作系统】操作系统常见面试题详解笔记
java·linux·服务器·网络·数据结构·算法·eclipse
薛定谔的悦19 小时前
《储能系统中的故障定位》
java·服务器·前端
六义义19 小时前
SpringBoot 超详细全解(入门 + 实战 + 原理 + 面试)
java·spring boot·面试
fengxin_rou19 小时前
详解深浅拷贝:从原理到实现的完整指南
java·后端·浅拷贝·深拷贝
tsyjjOvO19 小时前
【SpringMVC 进阶】拦截器、文件上传、异常处理与 SSM 整合全解析
java·后端·spring
222you19 小时前
JUC读写锁和阻塞队列
java·开发语言·spring