问题排查

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

原因分析:

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

在这里插入图片描述

在这里插入图片描述

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

知识扩展

"-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,应设为:

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

      或更简单:直接用

      -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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐