Mughees52/mysql-explain-analyzer

GitHub: Mughees52/mysql-explain-analyzer

一款基于浏览器的 MySQL 与 MariaDB EXPLAIN 可视化分析工具,提供自动问题检测、索引推荐与查询重写。

Stars: 4 | Forks: 0

# MySQL & MariaDB EXPLAIN 分析器 **免费、基于浏览器的查询计划可视化工具,具备自动问题检测和索引推荐功能。** [![Live Demo](https://img.shields.io/badge/Live%20Demo-reliadb.com-2980B9?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0xIDE3LjkzYy0zLjk1LS40OS03LTMuODUtNy03LjkzIDAtLjYyLjA4LTEuMjEuMjEtMS43OUw5IDE1djFjMCAxLjEuOSAyIDIgMnYxLjkzem02LjktMi41NGMtLjI2LS44MS0xLTEuMzktMS45LTEuMzloLTF2LTNjMC0uNTUtLjQ1LTEtMS0xSDh2LTJIMTB2LTJIMTJ2LTJoMmMuNTUgMCAxLS40NSAxLTFWNy41YzIuNSAxLjcxIDQuNDYgNC44NyA0Ljk1IDguNTFIMTd2MWMwIDEuMS0uOSAyLTIgMnoiLz48L3N2Zz4=)](https://reliadb.com/tools/explain/) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg?style=for-the-badge)](LICENSE) [![GitHub Stars](https://img.shields.io/github/stars/Mughees52/mysql-explain-analyzer?style=for-the-badge&color=E67E22)](https://github.com/Mughees52/mysql-explain-analyzer/stargazers) [![Vue 3](https://img.shields.io/badge/Vue-3-4FC08D?style=for-the-badge&logo=vue.js&logoColor=white)](https://vuejs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org/) [Live Demo](https://reliadb.com/tools/explain/) | [Blog Post](https://reliadb.com/blog/mysql-explain-analyzer-free-query-plan-visualizer.html) | [Report Bug](https://github.com/Mughees52/mysql-explain-analyzer/issues)
## 为什么使用此工具? PostgreSQL 社区有 [explain.dalibo.com](https://explain.dalibo.com) 和 [PEV2](https://github.com/dalibo/pev2)。MySQL 曾长期缺乏同类工具 — 直到现在。 MySQL 的原始 EXPLAIN 输出包含了查询性能的所有信息,但阅读嵌套树结构或 JSON 计划并不直观。此工具为你完成解读:粘贴 EXPLAIN 输出,即可获得带自动问题检测的可视化树、智能索引建议以及可执行的查询重写。 **100% 客户端运行** — 你的查询计划永远不会离开浏览器。无后端、无 API 调用、无需注册。 ## 功能特性 ### 分析引擎 | 功能 | 说明 | |------|------| | 检测规则 | 49 条规则(8 条关键、20 条警告、5 条信息、7 条良好、4 条 MariaDB 专属、5 条 MySQL 8.0+) | | 索引顾问 | 查询感知、解析表别名、建议复合覆盖索引、主键感知 | | 查询重写 | 7 种模式:YEAR()→范围、子查询→JOIN、NOT IN→LEFT JOIN、OFFSET→keyset 等 | | 影响模拟 | 预测每个索引对结构计划的影响(访问类型、行数减少、覆盖扫描) | | 评分 | 基于 0-100 加权评分,含严重性细分 | ### 可视化 - **交互式树** — 边线粗细 = 行数,节点徽章颜色编码(慢/高成本/估算错误/过滤) - **高亮模式** — 在时长、行数、成本热图之间切换 - **4 个视图标签** — 树、表、成本图表、估算 vs 实际 - **前后对比** — 并排比较两个计划 ### 支持格式 | 格式 | 引擎 | 示例 | |------|------|------| | `EXPLAIN ANALYZE`(树) | MySQL 8.0+ | `-> Nested loop inner join (cost=7.45 rows=16) (actual time=0.08..0.16 rows=16 loops=1)` | | `EXPLAIN FORMAT=JSON` | MySQL / MariaDB | `{ "query_block": { "select_id": 1, ... } }` | | 传统表格式 | MySQL / MariaDB | `+----+------+-------+------+------+-------+` | | `ANALYZE` 表 | MariaDB 10.1+ | 包含 `r_rows` 和 `r_filtered` 列 | | `ANALYZE FORMAT=JSON` | MariaDB 10.1+ | 包含 `r_total_time_ms`、filesort 嵌套 | 可直接从终端粘贴 — 工具会自动去除 `mysql>` 提示符、`| ... |` 边框、`+---+` 分隔符、SQL 续行(`-> SELECT`、`-> GROUP BY`)以及 `N rows in set` 页脚。 ## 快速开始 ### 使用托管版本(推荐) **[reliadb.com/tools/explain/](https://reliadb.com/tools/explain/)** — 零配置,始终最新。 ### 本地运行 ``` git clone https://github.com/Mughees52/mysql-explain-analyzer.git cd mysql-explain-analyzer npm install npm run dev # Dev server at localhost:5173 ``` ### 构建生产版本 ``` npm run build # Output in dist/ npm run preview # Preview the build ``` ## 使用方法 1. **在慢查询上运行 EXPLAIN ANALYZE**: ``` EXPLAIN ANALYZE SELECT * FROM orders WHERE status = 'pending'; ``` 2. **将输出粘贴到 EXPLAIN 输出框中** — 请按终端打印的原始格式粘贴,包括边框。 3. **添加 SQL 查询(可选)** 在“SQL 查询”标签页中 — 可解锁查询重写建议。 4. **添加表 DDL(可选)** 在“表结构”标签页中 — 可启用复合索引推荐和架构分析。 ## 捕获的问题 ``` Full table scan on `orders` (50,529 rows) ├── Critical: No index on WHERE columns ├── Recommendation: ALTER TABLE orders ADD INDEX idx_status (status); └── Impact: Full table scan (ALL) → Index lookup (ref) Filesort on 10,000 rows ├── Warning: ORDER BY not covered by index ├── Recommendation: ALTER TABLE orders ADD INDEX idx_status_amount (status, total_amount); └── Impact: Eliminates filesort, reads in index order Dependent subquery (executes once per outer row) ├── Critical: O(n*m) complexity ├── Rewrite: Convert to JOIN └── Generated SQL provided ``` ## 检测规则摘要 | 严重性 | 数量 | 示例 | |--------|------|------| | **关键** | 8 | 全表扫描(大表)、文件排序超过 1K 行、临时表、笛卡尔积、依赖子查询、未索引嵌套循环、大量行数不匹配 | | **警告** | 20 | 行数估算偏差 >10 倍、无可用索引、全索引扫描、高循环次数、连接缓冲区、反向扫描 | | **信息** | 5 | 小表扫描、ICP 已使用、子查询物化、哈希连接、覆盖索引 | | **良好** | 7 | 最优 eq_ref、覆盖索引、高效范围扫描、主键查找 | | **MariaDB** | 4 | 行 ID 过滤、FirstMatch/LooseScan 半连接、哈希连接、低 r_filtered | | **MySQL 8.0+** | 5 | 哈希连接、并行扫描、Skip Scan、索引合并、反连接 | ## 索引顾问智能 它不仅仅是一个“WHERE 列 → 加索引”的工具。顾问会: - **合并跨子句列** — 将 WHERE、JOIN、GROUP BY、ORDER BY 与聚合合并为一个最优复合索引 - **主键感知** — 绝不会建议以主键列开头的索引 - **DDL 校验** — 确认建议的列在表结构中存在 - **去重** — 移除子集索引,优先推荐更宽的覆盖索引 - **已有索引感知** — 跳过与现有索引重复的建议 ## 分享与嵌入 - **分享链接** — 生成将计划压缩在哈希中的 URL。任何拥有链接的人均可查看你的分析。 - **嵌入** — 生成可用于博客、运行手册或内部文档的 `