Mughees52/mysql-explain-analyzer
GitHub: Mughees52/mysql-explain-analyzer
一款基于浏览器的 MySQL 与 MariaDB EXPLAIN 可视化分析工具,提供自动问题检测、索引推荐与查询重写。
Stars: 4 | Forks: 0
# MySQL & MariaDB EXPLAIN 分析器
**免费、基于浏览器的查询计划可视化工具,具备自动问题检测和索引推荐功能。**
[](https://reliadb.com/tools/explain/)
[](LICENSE)
[](https://github.com/Mughees52/mysql-explain-analyzer/stargazers)
[](https://vuejs.org/)
[](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。任何拥有链接的人均可查看你的分析。
- **嵌入** — 生成可用于博客、运行手册或内部文档的 `标签:49条检测规则, EXPLAIN分析器, MariaDB, SEO, SQL优化, TypeScript, Vue 3, 二进制发布, 关键词优化, 前端可视化, 安全插件, 客户端分析, 开源工具, 性能优化, 数据库诊断, 查询计划可视化, 查询重写, 检测绕过, 浏览器端工具, 索引推荐, 自动化攻击