myflames — MySQL Query Plan Visualizer
Visualize EXPLAIN ANALYZE FORMAT=JSON output as interactive SVG charts.
Five views, one parser, zero external dependencies.
View on GitHub →
Documentation
Learn the algorithms — myflames teach
Interactive, offline-first HTML lessons that animate MySQL 8.4 and
MariaDB 11.x internals with correct cost models. Every lesson has
in-page sliders — no CLI flags, no re-running. Generated with
myflames teach <lesson> -o <file>.html.
- B+tree lookup — clustered PK vs covering vs non-covering secondary, 16 KiB page fan-out
- Midpoint-insertion LRU — why MySQL's buffer pool survives full-scan pollution
- Block Nested Loop — MariaDB 11.x default (MySQL removed it in 8.0.20)
- Hash join — build, probe, grace-hash spill on
join_buffer_sizeoverflow - BNL vs hash side-by-side — shared sliders, live cost comparison
- Filesort — sort_buffer_size, sorted runs, k-way merge
- Temporary tables — MEMORY to on-disk InnoDB conversion
- Index Condition Pushdown — filter inside InnoDB, skip unnecessary row fetches
- Index Merge — union, intersection, sort-union of row-ID sets
Flame graph — full execution hierarchy (default view)
Open full page (interactive) →Bar chart — slowest operations first
Open full page (interactive) →Treemap — area proportional to total time
Open full page (interactive) →Diagram — Visual Explain-style flow
Open full page (interactive) →Execution tree — collapsible plan tree
Open full page (interactive) →Query Analysis panel — scenario demos
Each view includes a Query Analysis panel: optimizer features detected, warnings, and concrete tuning suggestions.
Complex queries — real-world patterns
Non-trivial query shapes captured live against MySQL 8.4: multi-CTE with window functions, correlated subqueries (the N+1 anti-pattern), and recursive CTEs for tree traversal. Each demo pipes through the advisor + collector pipeline and emits a JSON sidecar next to the HTML so AI agents and external tools can consume the analysis without parsing the SVG.
Top-3 earners per department using ROW_NUMBER() OVER (PARTITION BY …).
N+1 anti-pattern: per-row scalar subquery to look up max/count.
Org-chart traversal — anchor + recursive JOIN until depth limit.
Optimizer switches — one flag per demo
Plans captured live with a specific @@optimizer_switch
feature active, so you can see what each switch looks like in a real
EXPLAIN plan and read the one-line impact the advisor emits.
Live connection mode — connect + explain + advise
These demos came from running myflames with real connection flags
(-h host -P port -u user -p -e "SELECT …") against
MySQL 8.4 and MariaDB 11.4. Each one embeds the collected schema,
stats, and session variables, plus environment-specific tuning
suggestions generated by the advisor. All 3 outputs (.svg,
.html, .json) are produced by a single CLI
invocation.
HTML report — self-contained shareable report
Generate with myflames --output report.html explain.json. Includes embedded chart, analysis sidebar, and export buttons.
Before vs After comparison
Generate with myflames compare before.json after.json. Shows time deltas, operator changes, and a "what got better / worse" summary.
Repository and README • Getting Started • CLI Reference • Architecture