# myflames > myflames is an open-source performance workspace for MySQL, MariaDB, and Percona Server for MySQL. Use the desktop app on macOS or the Windows x64 preview to follow a question from the query plan to the SQL, schema, and server behind it: inspect EXPLAIN ANALYZE plans as flame graphs, Visual Explain diagrams, execution trees and bar charts, compare before and after plans, and share the evidence with your team. The myflames handbook chapters and release notes, in handbook order. Each article sits under its title with its documentation page URL; links and images use absolute site URLs. The repository reference files are listed under Optional in llms.txt as separate Markdown files. --- # Installation & first steps Page: https://myflames.io/docs.html?article=quickstart Markdown: https://myflames.io/docs/quickstart.md # Installation & first steps myflames is a desktop performance workspace for MySQL, MariaDB and Percona Server. You can start with a saved JSON execution plan without connecting to a server. ## Choose your installation ### macOS, Apple Silicon Download the signed, notarized `.dmg` from [official downloads](https://myflames.io/download.html), open it, and drag `myflames.app` to Applications. Open the app from Applications. The current downloadable release checked for this site is **3.4.1**. A macOS Intel binary is not advertised in this release. ### Windows x64, preview Download the Windows setup `.exe` from [official downloads](https://myflames.io/download.html). The installer is unsigned; Windows SmartScreen may require **More info → Run anyway**. It installs for the current user. The Windows build is a preview tested on Windows 11 x64. A crash can leave a statement that was already running on the server until it finishes. Read the [desktop reference](https://myflames.io/docs/ref-desktop.md) before using maintenance operations. ## Updates myflames checks for a newer release when it starts and once a day while **Settings > Check for updates automatically** is on (the default); **Check for updates** in the window status bar on every screen and About myflames checks on demand. When an update is available, a badge beside the logo at the top of the sidebar follows the download until the update is ready. Choose **Update**, then **Restart to update**, or let the update install when you next quit the app. On macOS, keep `myflames.app` in your Applications folder so it can update in place. On Windows the update installs silently after the app quits. ## Appearance Try the step-by-step guides for [settings and themes](https://myflames.io/docs/howto.md#settings-and-themes) and [layout](https://myflames.io/docs/howto.md#layout). Choose a theme in **Settings > Appearance**, where a card per theme previews its colors, or open **Search…** (⌘K on macOS, Ctrl+K on Windows) and type **Theme:**. Available themes are System, Light, Dark, Fire, Digital Rain, Neon Grid, Dracula, Nord, Solarized Light, Solarized Dark, Tokyo Night, Gruvbox Dark, Catppuccin Mocha, Catppuccin Latte, GitHub Light, GitHub Dark and One Dark. The choice is kept on this computer and applies to navigation, views, tables, dialogs, the Query editor and charts. System follows your operating system's light or dark appearance. Editor palettes are adapted for readable text and selections. Chart operator colors, status meanings and Production (purple) and Development (teal) connection colors keep their meaning in every theme. Palette credits and licenses are in [NOTICE](https://myflames.io/docs/source/NOTICE). ## Sidebar and status bar Drag the sidebar's right edge to choose its width. You can also focus the edge and use Left or Right (hold Shift for a larger step). Double-click, Home or End restores the default width. Narrow windows keep their compact navigation rail. Sidebar and Server inspector widths, the Server view navigation choice, Health auto-refresh choices for Production and Development, Query editor Explain format, and File transfer hidden-file and Transfers-panel choices survive app restarts alongside your theme. Every screen has one window status bar. Its right end shows the installed version, update status, **Check for updates** and **View releases**. The current view's safety, connection, session and refresh facts remain on the left; narrow windows shorten these facts before the update actions. ## Start with an exported plan Open Plans in the desktop app and import your exported JSON plan. Select Visual Explain, Flame graph, Tree or Bar chart, then select an operator to inspect its measurements and findings. To share it, choose **Export** in Plans for a standalone HTML report or JSON. **Hide literal values** reduces what is shared, but object names and measurements remain; inspect the export before distributing it. ## Connect to a server The app includes the MySQL 8.4 LTS client (`mysql` and `mysqldump`) and finds installed client tools. For each server it prefers tools of the same engine and major.minor series, then the nearest newer series, then the newest older series with a warning. Within that series, authentication plugins come first, then the newest patch, then installed before bundled. MariaDB accounts using `ed25519` or `parsec` need MariaDB tools, and Maintenance may also need `mysqlsh` or `mariadb-dump`. Open **Settings > Client tools…** to see the programs for the connection in use and every installation found. MySQL and MariaDB each have a choice: **Automatic (best match for each server)** or an installation you choose. A choice that stops working stays selected with its error until you change it. If a view cannot use a client, **Choose client tools…** opens the same dialog; an authentication-plugin error names the plugin the client could not load. Add a connection on Home, choose a connection policy, and test it. Start with **Read-only** for inspection. Use SSH tunneling when your connection requires a bastion. Credentials and SSH configuration remain on your computer. Home's Connections table calls its default-database column **Database** (tooltip "Default database"); the connection form keeps **Default database**. The table prioritizes product and version in **Server**, letting the stale-time hint truncate first, and its default columns are sized for a 1440 px window. It keeps the last facts collected for each server (product, version, replication or cluster role, read-only and Performance Schema state) and shows them even while the server is offline, marked as stale. Choose **Check now** from a connection's menu to refresh them; Test connection and an explicit choice in the connection picker also check the server. To bring connections over from another tool, open the Connections header menu and choose **Import from MySQL Workbench or DBeaver…**, pick **MySQL Workbench** or **DBeaver** in **From**, review the selected rows and the duplicates it found in the wider preview, then import. The sheet shows an error alert only when there is an error. Imported connections use the Production policy and carry no password, so review their TLS and SSH settings and test before use. Use **Back** and **Forward** in the top bar (**⌘[** and **⌘]** on macOS, **Alt+Left** and **Alt+Right** elsewhere) to move across places, Server and Workload views, query tabs and open plans, or open **Search…** (**⌘K** / **Ctrl+K**) for recent destinations, commands, and database objects on the connection in use. The macOS app stores its data under `~/Library/Application Support/myflames-desktop`; Windows uses `%APPDATA%\myflames-desktop`. ## Choose a next step - [Understand a plan](https://myflames.io/docs/plans.md) - [Work in the Query editor](https://myflames.io/docs/queries.md) - [Inspect server health](https://myflames.io/docs/server.md) - [Check engine compatibility](https://myflames.io/docs/compatibility.md) - [Understand connection policies](https://myflames.io/docs/safety.md) --- # How-to guides Page: https://myflames.io/docs.html?article=howto Markdown: https://myflames.io/docs/howto.md # How-to guides Follow these steps to try common tasks in the desktop app. Shortcuts show macOS keys first, then Windows and Linux keys. ## Multiple cursors Use multiple cursors to make the same edit in several places at once. 1. Open **Query editor** and paste this practice SQL: ```sql SELECT id FROM orders WHERE status = 'new'; SELECT id FROM orders WHERE status = 'paid'; SELECT id FROM orders WHERE status = 'refunded'; ``` 2. Click just after `id` on the first line. Hold **Option** / **Alt** and click just after `id` on the other two lines to add cursors. If no cursors appear, turn on **Settings > Query editor > Multiple cursors**. 3. Type `, customer_id` once to add it on all three lines. Press **Esc** to keep one cursor; if suggestions are open, press **Esc** once to close them first. 4. Click inside the first `status`. Press **⌘D** / **Ctrl+D** to select the word, then again to add its next occurrence. Type `state` to replace both selections, then press **Esc** until only one cursor remains. 5. Click inside `orders` and press **⇧⌘L** / **Ctrl+Shift+L** to select every occurrence. Press **Esc** to keep one cursor. 6. Hold **⇧Option** / **Shift+Alt** and drag across `id` from the first line to the third for a rectangular selection. ![Open Query editor and paste three SELECT id FROM orders statements with status values new, paid and refunded. Click after the first id, then Option-click on macOS or Alt-click on Windows and Linux after the other two. If cursors do not appear, turn on Settings > Query editor > Multiple cursors. Type comma, space and customer_id to edit all three. Press Esc, closing suggestions first if needed, to keep one cursor. Click status, press Command+D or Ctrl+D twice and type state to replace two occurrences, then press Esc until one cursor remains. Click orders and press Shift+Command+L or Ctrl+Shift+L to select all occurrences, then Esc. Hold Shift+Option or Shift+Alt and drag across id on all three lines to select a rectangle.](https://myflames.io/assets/howto-multi-cursor.gif) Related: [Edit SQL, suggestions and checks](https://myflames.io/docs/queries.md#edit-sql-suggestions-and-checks). ## Suggestions Use suggestions to complete SQL keywords, table names and columns while you type. 1. Open **Query editor**, choose a connection and **Database**, and start with an empty tab. The recording uses an `orders` table with a `status` column; use names from your database. 2. Type `SEL` and press **Tab** to accept `SELECT`. If the list is closed, press **Ctrl+Space** on either platform to request it. 3. Type ` FROM o` and choose `orders` from the list. Type ` o` after the table name to give it an alias. 4. Click after `SELECT ` and type `o.`. Choose `status` from the list, then type a space before `FROM` to finish `SELECT o.status FROM orders o`. 5. Press **Ctrl+Space** to request suggestions again, then **Esc** to close them. Manual suggestions also work when **Settings > Query editor > Suggestions while typing** is off. ![Open an empty Query editor tab and choose a connection and database containing orders with a status column, or use your own names. Type SEL and press Tab to accept SELECT. Type space FROM o, choose orders, then type space o for its alias. Click after SELECT and its following space, type o. and choose status, then type a space before FROM to form SELECT o.status FROM orders o. Ctrl+Space requests suggestions on macOS, Windows and Linux even when Suggestions while typing is off; Esc closes the list.](https://myflames.io/assets/howto-suggestions.gif) Related: [Edit SQL, suggestions and checks](https://myflames.io/docs/queries.md#edit-sql-suggestions-and-checks). ## Find and replace Use find and replace to locate repeated text and change it throughout a query tab. 1. Open a **Query editor** tab containing repeated text, such as the `status` names in the [multiple-cursor example](https://myflames.io/docs/howto.md#multiple-cursors). 2. Press **⌘F** / **Ctrl+F** and type `status` in **Find**. Press **⌘G** / **Ctrl+G** to move to the next match while Find is open. 3. Press **⌥⌘F** / **Ctrl+H** to open Replace, then type `state` in **Replace with**. 4. Check the highlighted matches. Choose **Replace** to change one match or **Replace all** to change all matches in the tab. 5. Click back in the editor and press **⌘Z** / **Ctrl+Z** to undo the replacement in one step. ![In a Query editor tab with repeated status names, press Command+F on macOS or Ctrl+F on Windows and Linux and search for status. While Find is open, Command+G or Ctrl+G advances to the next match. Press Option+Command+F or Ctrl+H, enter state in Replace with and check the highlighted matches. Choose Replace for one match or Replace all for the whole tab. Click in the editor and press Command+Z or Ctrl+Z to undo the replacement in one step.](https://myflames.io/assets/howto-find-replace.gif) Related: [Work with SQL and results](https://myflames.io/docs/queries.md#work-with-sql-and-results). ## Settings and themes Use Settings to choose a theme and change how the Query editor behaves. 1. Click the gear at the bottom of the sidebar, or press **⌘,** / **Ctrl+,**, to open **Settings**. 2. Choose **Appearance**. Select **Dark** to try it across the app, then **System** to follow your operating system's appearance again. There are 17 choices. 3. Choose **Query editor**. Switch **Multiple cursors** off, then on again, to try the control. Leave it on to use the multiple-cursor guide. 4. Press **Esc** or choose **Back** to return to your previous view. Your theme and editor settings are kept on this computer across app restarts. ![Click the sidebar gear or press Command+comma on macOS or Ctrl+comma on Windows and Linux to open Settings. Choose Appearance and select Dark to try it, then System to follow the operating system again; there are 17 choices. Choose Query editor and switch Multiple cursors off and back on. Press Esc or choose Back to return to your previous view. Theme and editor settings are saved on this computer across restarts.](https://myflames.io/assets/howto-settings-theme.gif) Related: [Appearance](https://myflames.io/docs/quickstart.md#appearance) and [Query editor settings](https://myflames.io/docs/queries.md#edit-sql-suggestions-and-checks). ## Layout Use the layout controls to give navigation, SQL or results more room. 1. Open **Query editor** and run a SELECT from your database with **⌘Return** / **Ctrl+Enter** to show results below the editor. 2. Drag the sidebar's right edge to make it wider. For the keyboard alternative, press **Tab** until the edge has focus and use **Left** or **Right**; hold **Shift** for a larger step. Narrow windows use a compact navigation rail instead. 3. Drag the divider between the SQL editor and its results down to make the editor taller, or up to give the results more room. 4. Double-click the sidebar's right edge to restore its default width. With the edge focused, **Home** or **End** also restores it. Your chosen sidebar width survives app restarts. 5. Look at the window status bar's right end for the installed version, **Check for updates** and **View releases**. The same bar appears on every screen. ![Open Query editor and run a SELECT with Command+Return on macOS or Ctrl+Enter on Windows and Linux to show results. Drag the sidebar's right edge wider, or focus it with Tab and use Left or Right, holding Shift for larger steps. Narrow windows keep a compact rail. Drag the divider between SQL and results down for more editor space or up for more result space. Double-click the sidebar edge, or focus it and press Home or End, to restore its default width. Sidebar width is kept across restarts. Every screen's bottom status bar shows the installed version, Check for updates and View releases on the right.](https://myflames.io/assets/howto-layout.gif) Related: [Sidebar and status bar](https://myflames.io/docs/quickstart.md#sidebar-and-status-bar) and [Query workspace layout](https://myflames.io/docs/ref-query-workspace.md). ## Run and explain Use Run to see a SELECT's results and Explain to inspect how the server plans to find them. 1. Open **Query editor**, choose a connection and **Database**, and enter a SELECT for a table there. The recording uses `SELECT id, customer_id, status, total FROM orders WHERE status = 'new' ORDER BY id LIMIT 24;`. 2. Click inside the statement and press **⌘Return** / **Ctrl+Enter**, or choose **Run**. Read the result rows below the editor. 3. Choose **Table** beside **Explain**, then choose **Explain** (**⌘E** / **Ctrl+E**). Its result shows the server's estimated plan; **Run analysis** executes the SELECT to measure it. 4. In the Explain result, choose **Explore** to open the visual plan in **Plans**. On MySQL, first commit or roll back any open transaction and turn autocommit on. Inspect the operators in Visual Explain, Flame graph, Tree or Bar chart. ![Open Query editor, choose a connection and database, and enter SELECT id, customer_id, status, total FROM orders WHERE status = 'new' ORDER BY id LIMIT 24, using a table and columns from your database. Click in the statement and press Command+Return on macOS or Ctrl+Enter on Windows and Linux, or choose Run, to see results. Choose Table beside Explain, then Explain or Command+E or Ctrl+E for the estimated plan; Run analysis executes the SELECT for measurements. Choose Explore in the Explain result to open Plans and inspect Visual Explain, Flame graph, Tree or Bar chart. On MySQL, first finish any open transaction and turn autocommit on.](https://myflames.io/assets/howto-run-explain.gif) Related: [Work with SQL and results](https://myflames.io/docs/queries.md#work-with-sql-and-results) and [Explain a statement](https://myflames.io/docs/queries.md#explain-a-statement). --- # Why myflames Page: https://myflames.io/docs.html?article=motivation Markdown: https://myflames.io/docs/motivation.md # Why myflames Performance work is a sequence of questions. Where does this statement spend time? Which operator deserves attention? What changed between the two runs? What was the server doing at the same time? myflames gives those questions a shared workspace. Visual plans make a hierarchy easier to inspect. Captures and comparisons keep context around a change. Server views connect the statement to sessions, locks, configuration and I/O. ## A tool for understanding The workspace should help a developer reading an unfamiliar plan and a DBA following a difficult one. Operator details, supporting evidence and guided lessons let you move between a quick view and a deeper explanation. ## Open to inspection The project is open source under Apache-2.0. You can inspect how a measurement or finding is derived, reproduce an issue, build the application and contribute a correction. This website makes no performance-speedup promise. A useful result is a better-supported decision about the query or server you are actually investigating. ## The work it builds on Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). Brendan Gregg and Tanel Poder are the origin of this visualization inspiration and remain credited in the project. Current flame graph renderers are clean-room implementations. Releases up to 2.3.0 retain their historical CDDL-1.0 license. --- # Execution plans & comparison Page: https://myflames.io/docs.html?article=plans Markdown: https://myflames.io/docs/plans.md # Execution plans & comparison An execution plan describes how the engine will get a result. A timed plan also records what happened while the statement ran. myflames turns exported JSON into multiple views of the same plan. ## Choose a view for the question | View | Useful for | | --- | --- | | Visual Explain | Following operators, access paths and joins in a diagram | | Flame graph | Seeing how measured execution work is distributed through the operator hierarchy | | Execution tree | Reading the hierarchy and measurements as an expandable tree | | Bar chart | Comparing the work associated with individual operators | | Stats | Totals by table and operator type; all occurrences of an operator | Estimated plans contain cost and cardinality estimates, not measured operator timings. A cost estimate is not elapsed time. Compare compatible capture modes and check loops when interpreting per-operator measurements. ## Capture, then investigate Write the statement in the Query editor and choose **Explain** for the server's own plan, then **Explore** to open it in Plans as an estimated plan (see [Query editor](https://myflames.io/docs/queries.md#explain-a-statement)). **Run analysis** is the timed choice: it executes the SELECT, so the query still consumes server resources. Check the [engine compatibility guide](https://myflames.io/docs/compatibility.md) before choosing it. When a measured plan has eligible base-table accesses or filters directly above them whose actual and estimated rows per loop differ by at least 10×, with at least 1,000 estimated or actual rows across loops, **Misestimates N** appears in the plan's measurements. Press it to visit each one, worst ratio first; Visual Explain, the flame graph, the execution tree and the bar chart mark them in violet (when the bar chart omits an operator because its self time is zero, a status message above the chart explains why and the inspector still opens it). Overestimates below an early-stop operator are skipped; MariaDB compares only eligible index lookups and only underestimates. The inspector's Row estimate section tells you how far off the estimate was and, when the plan was captured from a live server with an account that can read the server's statistics tables and the operator's table maps unambiguously to a single base table in the captured schema evidence, when the table's statistics were last refreshed and an `ANALYZE TABLE` statement to copy and run yourself. ## Compare before and after Capture both plans around a change, keep the SQL and relevant execution conditions comparable, and open them side by side in **Plans › Compare**. Plan changes are evidence to investigate. Cache warmth, data distribution, concurrent load and capture mode affect how timing comparisons should be read. ## Keep the investigation useful Save captures in Investigations, inspect ranked findings and follow their supporting operators. Export a report for a colleague with **Hide literal values** enabled. Table and column names, measurements and versions remain visible. For measurement definitions and operator encodings, open the [Visual Explain reference](https://myflames.io/docs/ref-visual-explain-reference.md). --- # Query editor & slow queries Page: https://myflames.io/docs.html?article=queries Markdown: https://myflames.io/docs/queries.md # Query editor & slow queries The Query editor combines multi-tab SQL sessions, schema browsing, completion, formatting and result exports. Each tab has a dedicated session, so transaction state belongs to that tab. ## Work with SQL and results Choose a connection and the tab's default **Database**, enter SQL, then run the statement or selection. Its database list is read only while the Query editor is on screen; it is read again after a run that creates or drops a database and when you open the list after more than 10 seconds, so a database created elsewhere shows up without a restart. Choosing a database with an open session sends `USE` there; **None** keeps that session's database until it closes, then starts the next session without one, including after restore. A tab with a session on another connection refuses a database change. Under **Run options**, **On error: Stop / Continue** controls **Run all**. A finished Continue run counts succeeded and failed statements, plus not run, stopped and outcome unknown when present. After a deadlock or a lock wait timeout, a note says what InnoDB does in that case (a deadlock rolls back the victim's whole transaction; a lock wait timeout does only with `innodb_rollback_on_timeout` ON); check the transaction state before you go on. The ⓘ explains that an InnoDB error normally rolls back only the failed statement, while these cases roll back the whole transaction. Changing the mode requires a fresh write review. Open and save `.sql` or `.txt` files from the tab menu: **Open SQL file…** (**⌘O** / **Ctrl+O**), **Save…** (**⌘S** / **Ctrl+S**) and **Save as…** (**⇧⌘S** / **Ctrl+Shift+S**). Open allows up to 5 MiB, refuses special files and links swapped in after selection, and opens a new tab. Save refuses a symbolic-link target or a folder changed since selection; use Save as to choose it again. Adding `.sql` never replaces an existing file: choose the full name to replace it. An edited file tab shows a dot and asks before closing. If a backend restart loses its binding, Save opens Save as in the same operation; cancellation or failure keeps unsaved edits. Use **Find and replace** (**⌘F** / **Ctrl+F** for Find, **⌥⌘F** / **Ctrl+H** or **Ctrl+Alt+F** for Replace) with **Match case** (`Aa`), **Whole word** (`|ab|`) and **Regular expression** (`.*`) toggles. In the Find field, **Enter** / **Shift+Enter** steps through matches; **⌘G** / **⇧⌘G** (**Ctrl+G** / **Ctrl+Shift+G**) also steps through them while Find is open. **Replace** and **Replace all** insert replacement text literally, including `$1` and `$&`, as one undo step. A regular expression that exceeds the 250 ms search budget reports `Pattern too slow to search`. In **Schemas**, expand a database to browse tables, views, columns and indexes and its **Routines**, **Triggers** and **Events** folders (double-click to insert the qualified name, or use the row menu for **Show CREATE…**). Names containing XML-forbidden control characters keep their exact identity. Use transaction controls deliberately. Results export as CSV, JSON, SQL or Markdown; the row inspector lays out larger values, including JSON. After a run, the line beside the results reports the server's examined and returned rows, scans, joins without an index and temporary tables on disk for each statement. Open its information button for the counters and the verdict rule, or choose **Explain analyze** to review an analysis of that statement. **Explain analyze** appears only for statements it can read (SELECT, WITH and simple UPDATE, DELETE or INSERT … SELECT); for others, such as SET or SHOW, the line's tooltip says why. A failed statement's line starts with **Statement failed**. The transaction pill shows how long the transaction has been open, how many rows it changed and whether other waiting InnoDB transactions are blocked by it; open it for Commit, Roll back or **Show who waits**. If the account cannot read InnoDB details, the age is measured from the tab's first observation; if statement collection is off, the information button points to Server > Instruments. A result can be searched without running the query again: the filter field matches the loaded rows, and a cell's menu offers **Show only this value** and **Hide this value** as removable chips. Selection totals, copy and export then work on the filtered rows. **Pin result** keeps a result in the tab (up to 5,000 rows), and **Compare with pinned** lines a later result with the same columns up against it by a key column, marking added, removed and changed rows. Live work runs through the `mysql` or `mariadb` client selected for that server: the matching engine and major.minor series first, otherwise the nearest newer series or the newest older series with a warning. **Settings > Client tools…** shows the program, version, origin and reason, and lets you choose an installation for each engine. A tab keeps the client it started with, including for its plan and Stop helpers; a new session uses the current choice. Use Stop to cancel a running query. If the outcome of a transaction operation is unknown, inspect the session before retrying a change. ## Edit SQL, suggestions and checks Try the step-by-step guides for [multiple cursors](https://myflames.io/docs/howto.md#multiple-cursors) and [suggestions](https://myflames.io/docs/howto.md#suggestions). Hold **Option** and click (**Alt+click** on Windows and Linux) to add a cursor, or drag with **⇧Option** / **Shift+Alt** for a rectangular selection. **⌘D** / **Ctrl+D** selects the word at the caret, then adds its next occurrence; **⇧⌘L** / **Ctrl+Shift+L** selects all occurrences of the word at the caret or the selected text, including after selecting several identical occurrences, and **⌥⌘↑** / **Ctrl+Alt+↑** and **⌥⌘↓** / **Ctrl+Alt+↓** add a cursor above or below. **Esc** closes suggestions first, then keeps only the main cursor, then closes Find, Replace or Go to line, then closes Problems. Closing Find returns focus to the editor and keeps the current selection and cursors. With several cursors, **Run**, **Explain** and **Run analysis** use only the main cursor or selection; **Run all** still runs the whole tab. **Format SQL** (**⇧⌥F** / **Shift+Alt+F**) asks you to keep one cursor or selection before formatting. Use **⌘/** / **Ctrl+/** to toggle `-- ` comments, **⌥↑** / **Alt+↑** and **⌥↓** / **Alt+↓** to move a line, **⇧⌥↑** / **Shift+Alt+↑** and **⇧⌥↓** / **Shift+Alt+↓** to copy it up or down, and **⇧⌘K** / **Ctrl+Shift+K** to delete it. **Ctrl+G** on macOS (**Ctrl+G** on Windows and Linux when Find is closed, or **Go to line** in the Find bar) jumps to a line. Typing `(`, `[`, `{`, `'`, `"` or `` ` `` closes the pair, and the editor highlights matching brackets and quotes, the active line, and other occurrences of a selected word. **Query editor shortcuts** (the **ⓘ** button on the right of the editor toolbar) lists the editor shortcuts; **⇧⌥M** / **Ctrl+M** toggles whether **Tab** indents or moves focus. On macOS, **Control+K** deletes to the end of the line without opening the command palette. With suggestions and editor panels closed and one cursor, pressing **Esc**, then **Tab** within two seconds, temporarily lets Tab move focus. Suggestions while typing offer keywords and built-in functions for the server's release (an uncataloged patch or suffixed build uses the nearest earlier cataloged release in that series, named on the suggestion; an unknown series uses a small common keyword list), schemas, tables and columns from the connection, table aliases in the current `SELECT`, CTE names from `WITH`, and `@@` system variables with their scope (`global`, `session` or both, plus `deprecated`). Accept with **Tab**, **⇧Tab** / **Shift+Tab** or **Return** / **Enter**; functions add `()` unless an opening `(` already follows, unqualified columns across joined tables insert `alias.column`, and names that are server keywords or not plain identifiers are quoted in backticks with internal backticks doubled. When **Suggestions while typing** is off, **Ctrl+Space** (or **Ctrl+Shift+Space**) still requests suggestions. When the database list reports at most 200 tables, table names match fuzzily; otherwise tables are read by prefix, with **More tables match. Keep typing to narrow the list.** shown when truncated. Suggestions are unavailable in scripts over 60,000 characters. Keywords, functions and names already in memory appear as you type. Other database names join the same open list when their read finishes. Cached names remain available while they refresh in the background; switching connections or changing credentials clears them. Selections and matching words use distinct, readable highlights in light and dark themes, including when focus moves away from the editor. Hovering over a table or alias shows `schema.table`, its **Estimated rows** when already in memory from a cached table list, and up to 12 columns with types, key flags (`PRI`, `UNI`, `MUL`) and `NULL` / `NOT NULL` flags (plus how many more remain); hovering over a column shows its type and flags. Inside a known built-in function call, a hint above a single caret shows the argument count when known for that release and the current argument number, never parameter names. The hint stays hidden with several cursors or a selection, and when the opening `(` is more than 4,000 characters before the caret. Problem warnings underline `UPDATE` or `DELETE` without `WHERE`, table names missing from a schema's complete cached table list, and qualified columns (`table.column` or `alias.column`) missing from a table's complete cached column list (**⇧⌘M** / **Ctrl+Shift+M** opens **Problems**; closing it returns focus to the editor; **F8** and **⇧F8** / **Shift+F8** step through it). Warnings never fetch metadata. Missing-name warnings need fresh, complete, untruncated lists already read; references to tables created earlier in the script, CTEs and `DUAL` are exempt. Once the session has created a temporary table, missing-table warnings are suppressed; missing-column and missing-`WHERE` warnings can still appear. All warnings stay silent at and after `USE` or an executable comment (`/*! ... */`, `/*M! ... */`), inside routines, triggers, events or `BEGIN ... END` blocks, for unbalanced statements, in scripts containing a `DELIMITER` line, and in scripts over 60,000 characters. Above that size, syntax colors, bracket matching, suggestions, hover details and argument hints also switch off. In **Settings** (the gear at the bottom of the sidebar, **⌘,** / **Ctrl+,**, or the command palette), the **Query editor** section has six switches kept on this computer: **Multiple cursors**, **Suggestions while typing**, **Close brackets and quotes**, **Wrap long lines** (off by default; the other five default on), **Problem warnings** and **Details on hover**. Multiple-cursor gestures and occurrence shortcuts need **Multiple cursors** on; hover details and argument hints need **Details on hover** on. ## Explain a statement **Explain** works like MySQL Workbench: it runs the server's own `EXPLAIN` for the statement under the cursor, in the tab's session, and shows the rows in an Explain result tab you can export. Choose the format beside the button: Table (`EXPLAIN FORMAT=TRADITIONAL`, plain `EXPLAIN` on MariaDB), Tree (MySQL 8.0.16 and later) or JSON. For a supported SELECT, **Explore** captures a JSON plan in the tab's session and opens it in Plans as Visual Explain, flame graph, tree or bar chart; on MySQL, first commit or roll back any open transaction and turn autocommit on. `:name` placeholders are filled from Parameters as literal values. Explain does not run the statement, but the server evaluates constant expressions and derived tables while it plans. A statement whose planning could change something, such as taking a named lock or assigning a variable, is reviewed under the connection's policy like any other change. **Run analysis** executes a SELECT for a timed plan (`EXPLAIN ANALYZE FORMAT=JSON` on MySQL 8.3 and later, `ANALYZE FORMAT=JSON` on MariaDB). For a simple single-table UPDATE or DELETE, or an INSERT or REPLACE with a SELECT source, it prepares a SELECT that reads the same rows, in a new tab, for you to review first; that measures finding the rows, not the cost of the write, triggers, constraints or locking. Other statements are refused. ## Find the queries to investigate Query digest has three sources: - **Statement digests:** Performance Schema aggregates. Availability of samples, quantiles and CPU data depends on the engine/version. - **Slow log table:** Read `mysql.slow_log` on the selected connection. - **Slow log file:** Aggregate a local MySQL, Percona Server or MariaDB slow log by statement fingerprint, with no database connection. For Performance Schema, a time range selects statements seen in that range; the displayed aggregates remain totals since counting began. It does not turn those counters into interval-only measurements. With Statement digests, **Save baseline** in the Refresh menu keeps the statement totals on this computer for that server (`server_uuid` on MySQL, or `hostname:port` on MariaDB, read with the digest list; literal values hidden, no sample statements). **Compare with baseline** lists what is new since the baseline and what got more than 50% slower or more frequent, before and after; the information button next to the list states the rule. Growth needs at least ten calls since the baseline. After a restart or when the digest table's oldest `first_seen` timestamp moved forward (a digest table reset), only average latency is compared. The file's timestamps are interpreted in the log's own clock. With the **Slow log table** source, opening a statement also reads its **Tables** section (metadata only, no table rows). Top statements and Query digest share one statement inspector and statement thread. When a statement in **Top statements** or **Query digest** was cut off ("ON DUPLICATE ..."), its details name the server setting that cut it, its current value, a suggested value and about how much memory raising it costs. Both settings need a restart: copy the option-file lines, or on MySQL 8.0 and later the `SET PERSIST_ONLY` statements, which you can also apply from Server > Parameters as a reviewed change. In **Top statements** and Query digest's **Statement digests** source, a statement flagged No index used or Full scan offers **Suggested index** under Flags. Choose **Read suggestion** to check an estimated plan (`EXPLAIN FORMAT=JSON`, SELECT only) and the table's existing indexes. Planning can evaluate expressions, so opening the inspector starts no such read. A fresh result is reused when you reopen it; **Read again** reads anew. A suggestion is a `CREATE INDEX` to copy or open in the Query editor; nothing is created for you. An index already leading with those columns is named instead. For the narrow `SELECT * FROM t` case, the recorded text is enough to explain that no index reduces the rows read if `t` is a base table. After a suggested `CREATE INDEX` succeeds in its Query editor tab, **Measure the statement again** there opens the source statement and asks before one Run analysis on the same connection. Its **Analysis** tab shows the digest's before average latency and rows examined per execution beside this run's statement-history time and rows examined (which may be unavailable). **Compare plans** appears there when an earlier non-session capture of the same SQL, connection and database is still in memory, and opens the two captures in **Plans > Compare**. ## Import CSV Open Import CSV from a table's menu in Schemas or Server → Tables. To create a table, use the database's menu. The import checks rows against the destination types, reports problems by line, and reviews the write before sending it. Imports use batched INSERT statements by default. LOAD DATA LOCAL is offered only when the server already enables `local_infile`; myflames does not change that setting. Choose the transaction behavior and how bad rows are handled before importing. See the [detailed query workspace reference](https://myflames.io/docs/ref-query-workspace.md) for completion, dedicated sessions, result values and table data editing. --- # Server diagnostics & operations Page: https://myflames.io/docs.html?article=server Markdown: https://myflames.io/docs/server.md # Server diagnostics & operations Use the Server place to connect query behavior with server evidence. The data available depends on the engine, version, effective privileges and instrumentation that is already enabled. ## Begin with Health Health takes two counter samples per reading; live charts start after two completed readings. It refreshes itself while the view is on screen: Auto-refresh defaults to **While visible** (using the sampling window), with Off and fixed 10, 30 and 60 second intervals as the other choices; each automatic read waits one full interval after the previous read finishes, never replaces another connection's greyed report until **Refresh** (resuming the schedule afterwards), and reads immediately on return unless a failure backoff is still pending. **Capture when…** can save processlist, InnoDB status and lock evidence into an investigation when a configured condition is met. The watcher checks only while Health is on screen and for the connection it started on. A missing measurement is reported as Not judged or Partly judged, rather than interpreted as zero. **Is this normal?** **Save baseline** in the Refresh menu keeps the reading on screen on this computer, and **Compare with baseline** shows under each tile what it was and marks each verdict that changed. If the server restarted since, rates built from counters read Not compared, because a restart starts the counters over; Health refuses a verified server or version change between its two samples, and saving requires a verified matching identity and a reading that does not predate a detected restart. A baseline belongs to the server itself (its `server_uuid`, or host name and port on MariaDB, read in the same call as the Health or Query digest report), so it matches through any address that reaches that server; each server keeps up to 20 baselines of each kind. ## Follow a specific question | Question | Where to look | | --- | --- | | What is running or holding a transaction open? | Processlist | | Who blocks this statement or DDL? | Locks: blocking trees, metadata locks, row locks and latest deadlock | | Where does the server wait? | Waits and InnoDB | | Where does the server's memory go? | Memory (Workload > Resources) | | Which files or tables are busy? | I/O | | Which indexes need investigation? | Indexes and Tables | | How is the server configured? | Parameters, Versions and parameter comparisons | | What deserves a broader review? | Tuning and Full analysis report | In Processlist, the Lock / Trx column shows the session a waiter waits on and the number of sessions a blocker holds up, and the Locked filter puts root blockers first. The **Root blocker** pill leads the Lock / Trx cell. Select a row to follow the chain and see its longest wait; a session hidden by your filters is marked (not in this list). The inspector also loads the session's recent statements when the server's statement history is on. The Kill sheet keeps **What to end** directly below **Statement to send**, including in the minimum window. Before confirming a Kill, check the selected mode: Kill query only can leave an open transaction and its locks in place; Kill connection rolls the transaction back, and another blocker can still keep a session waiting. In Memory, choose By category, By session or By account; when categories were not collected but sessions were, it opens on By session. Values use binary units; select a row for its exact bytes, its source and the buffer pool context in its inspector. The table uses **Sum of highs** and **Share (%)**, with full names on hover; the inspector calls the former **Sum of event highs** (upper bounds, not a recorded peak), or **Session high** for MariaDB's processlist counters. A missing total high reads "sum of highs not collected". General rules of thumb appear once in the notes (ⓘ); a finding about a row has a status pill there and its reason in the inspector. Refresh takes two samples over the chosen window; growth is flagged only above both 1% of the starting total and 16 MiB, and it is a reason to inspect the workload, not proof of a leak. The 25% category rule of thumb covers only temporary tables, sort, join and hash buffers, and network. Not collected means attribution is unavailable; open Server > Instruments to review coverage. Tracked allocation bytes are not the server process's RSS or the machine's memory use. MariaDB can show allocator and session memory even with Performance Schema off. The Full analysis report composes several diagnostic modules. Error log and Locks are outside that report's coverage; inspect those views separately. Parameters and Users and roles show **Changed through myflames** in the selected object's inspector: the latest matching change the Audit log kept on this computer, with readable operation names (raw keys on hover), the hint "Kept on this computer.", and its stored statements in boxes with Copy beside them and the outcome. Only successful or outcome-unknown records qualify. **Open in Audit log** shows that exact record; **Show all records** returns to the full log. Where **Undo** is offered for a parameter, it opens the usual review with the earlier value filled in; review the current server and the exact statement before confirming. This history covers only changes made through myflames on this computer, and an index's history matches only records that name that index: a change recorded against the whole table is not attributed to one index. ## Replication, clusters and maintenance Dedicated places inspect replication channels, GTIDs, workers and lag; MariaDB Galera, Percona XtraDB Cluster, MySQL InnoDB Cluster and Group Replication; ProxySQL backend pools, query rules and digests; and Readyset shallow and deep caches, proxied queries, base-table snapshotting, dynamic parameters and performance telemetry across ProxySQL + Readyset + MySQL or MariaDB topologies. Maintenance finds the MySQL and MariaDB tools on this computer as soon as it opens and runs upgrade checks, dumps, restores and MySQL CLONE. In **Tools**, **Used for this server** names the program, version, origin and selection reason for queries, dumps, restores and MySQL Shell when selected, with warnings for missing or older tools. The list below shows every copy found, including its path and origin. **Change…** opens **Client tools**, also available from **Settings > Client tools…**, where **Automatic (best match for each server)** or a chosen installation applies separately to MySQL and MariaDB servers. SQL restores and CLONE use the client from the selected dump installation; a missing program in a chosen installation is reported without substituting another installation. **Start dump…**, **Start restore…** and **Start clone…** check first (reading only), then show the exact commands for you to confirm. When no client tool can run a dump or restore for the server (for example a MariaDB server on a computer without MariaDB client tools), the tab names the missing program, with **Choose client tools…**, instead of starting. The dump **Tool** list offers only tools that can run, and **Automatic** names `mysqldump` when no MySQL Shell is installed. A running job shows a progress bar, the step it is on and the elapsed time. MySQL Shell reports its own percent. `mysqldump` and `mariadb-dump` print nothing, so for them the bar is an estimate ("≈46%") from the bytes written to `dump.sql` against the server's table sizes, while that estimate exists and the output stays below it; otherwise the bar keeps moving without a percent. The job card also shows the bytes written and, once measurable, the rate. A compact summary beside the Start button shows the job's state, the percent when known and the bytes written, with **Show progress** to jump to the job card. A dump you started opens its folder in Finder when it completes, and **Open in Finder** opens it again; on Windows, use **Open in File Explorer**. In **Upgrade check**, the target list comes from the vendor: MySQL Community versions from the official release notes, Percona Server versions from Percona's package repositories. It offers only releases on a supported upgrade path (patches of your series, the next LTS series, and Innovation releases before it), newest first, with the newest release of the next LTS chosen for you. Under the list, myflames says how the server was installed (RPM packages, DEB packages, Ubuntu's own package or a generic archive, with the evidence under **How this was decided**) and what that means: which repository publishes the target, or for Percona the `percona-release enable-only` command for the target's repository. Releases Oracle removed from download, or published only as a Docker image, are left out. Offline, MySQL targets come from the releases bundled with myflames. Account management and protected server changes require review. Read the [write-safety guide](https://myflames.io/docs/safety.md) before taking an action. New dumps suggest a dated folder inside **Documents/myflames dumps** in your home folder (`%USERPROFILE%\Documents\myflames dumps` on Windows). If Documents does not exist, the default is **myflames dumps** directly in your home folder. A parent used by an earlier dump in the same window takes precedence; **Browse…** chooses another existing parent. Suggesting a path creates nothing. When the default parent is missing, the review says `Creates the folder .` and confirming the dump creates it. Other missing parent folders are refused, and a linked Documents folder cannot be used to create the default. A picked-tables SQL dump can restore after its source database was dropped. If the chosen target database is missing, the review includes its `CREATE DATABASE` before loading, using the source character set and collation recorded in newer dump manifests (older manifests use server defaults with a warning). Choosing the dump folder reads its manifest first. **New database…** is offered only when the dump can load into another database: a picked-tables dump with no CREATE DATABASE, CREATE SCHEMA, USE or database-qualified reference, or a single-schema Shell table dump. Otherwise **Default database** offers only **As in the dump**, with the reason under it. For a very large dump the restore review decides. Whole-database SQL dumps restore into the databases named in the dump. Review the target and commands before confirming. A load that fails before its session marker reports that nothing was loaded; after the marker, inspect the target because part of the dump may be loaded. **Tables > Fragmentation** ranks InnoDB tables by Reclaimable bytes (the free extents a rebuild could return) and shows Fragmentation % beside it. Select a table for its **Rebuild** statements, `OPTIMIZE TABLE` and `ALTER TABLE ... ENGINE=InnoDB`, to copy or open in the Query editor, plus a variant that is refused instead of blocking writes. Read the notes first: both rebuild online unless the table has a FULLTEXT or SPATIAL index, they need free disk about the size of the table, and replicas rebuild too. Fragmentation counts whole free extents only, so pages that are partly empty are not included. An unused-index finding is a candidate to investigate, not proof that dropping the index is safe. Collection windows, restarts, instrumentation and less frequent workloads all affect the evidence. ## Move files over SSH **File transfer**, in the sidebar after Tuning, moves logs, dumps and configuration files between this computer and your servers over SSH/SFTP, in two panes side by side. It does not use the database connection in use: save **SSH connections** of their own (host, port, user, and sign-in with your SSH agent, a key file or a password; on Windows, the SSH agent or a key without a passphrase), or start one from a saved database connection or a `~/.ssh/config` alias. The first connection to a server shows its host key fingerprint to compare before you trust it. Right-click a saved SSH connection to open, edit, duplicate, test, copy or delete it, and a file of this computer to show it in Finder or File Explorer. Drag files between the panes or from Finder. Transfers show their progress, with the rate and time left when known; a running transfer has **Cancel**, and a failed or cancelled one has **Retry**. On Windows, uploads and downloads are not available yet. --- # Schemas & version comparison Page: https://myflames.io/docs.html?article=schemas Markdown: https://myflames.io/docs/schemas.md # Schemas & version comparison Database diagram helps you explore the relationships in a schema. Schema versions lets you save definitions locally and compare them with another version, a file, or a live database. ## Compare the intended source with the target The **source** is the schema to match. The **target** is the schema that would change. The comparison lists differing objects and objects found only on one side, with definitions side by side. Generated sync SQL changes the target to match the source. myflames does not run the generated script. Objects found only in the target are left out until you explicitly choose them. Changes within a selected object can still drop columns or replace objects, and carry warnings. In **Schema versions**, choose **Save version…** to keep a database's schema on this computer, then **Compare** two schemas: saved versions, exported files, or databases read now, on the same server or on different ones. The sync script can be copied (**Copy script**) or opened in the Query editor (**Open in Query editor**) to review; myflames never runs it. ## Inspect the proposed change Read Drops data, May fail and rebuild warnings. ALTER algorithm predictions are comments that describe the expected behavior, not a guarantee that the operation will be inexpensive. Engine and version limits apply; MySQL 5.7 ALTER algorithm prediction is not available. Checks can flag definitions such as FLOAT money columns, utf8mb3 and missing foreign-key indexes. Not judged means the check could not establish a verdict. ## Export a schema as SQL Choose **Export as SQL…** for a saved version, or a database read now, to get a script that recreates the schema on another server. The export orders tables by foreign-key dependencies and omits definers by default. It is a script to review and run through your chosen process. Exporting it does not apply it to a server. --- # Learn the algorithms Page: https://myflames.io/docs.html?article=learn Markdown: https://myflames.io/docs/learn.md # Learn the algorithms Learn explains query-engine algorithms through guided animations. A lesson advances one idea at a time, with simplified code beside the drawing and a short Check yourself quiz at the end. ## Choose an algorithm family - **Joins:** nested loops, hash joins, block nested loops, batched key access and semijoin strategies. - **Indexes:** B-tree lookup, index condition pushdown, index merge, skip scan and rowid filtering. - **Scans and sorting:** full scans, filters, filesort, temporary tables, derived tables and covering indexes. - **Caching:** LRU and buffer pool warmup. Use Back and Next step to follow the explanation. Explore lets you move across the lesson steps and adjust inputs. Replay step shows the current step again. ## Build intuition, then return to evidence The diagrams and simplified code are teaching models. Server behavior depends on the engine, version, optimizer choices and data. A lesson helps explain an operator; use captured plans and live evidence to judge a specific query. Some lessons expose engine-specific behavior. For example, Filesort has a MySQL/MariaDB input, and Buffer pool warmup distinguishes their dump rules. --- # Connection policies & write safety Page: https://myflames.io/docs.html?article=safety Markdown: https://myflames.io/docs/safety.md # Connection policies & write safety myflames includes features that change server state. Choose the connection's policy to match the environment before using those features. | Policy | Behavior | | --- | --- | | Production | Confirms every change | | Development | Confirms risky changes such as DDL, KILL, SET GLOBAL, replication skips and CLONE | | Read-only | Refuses all changes before connecting | The policy appears in a strip along the window and in write-review sheets. Development is not a read-only setting. ## Review exact SQL For protected actions, the SQL shown in the review is the SQL authorized for execution. The app binds the review to the statements and target, checks the target again before acting, and records the result in the local Audit log. Privilege checks can report an action as unknown when they cannot prove that it is allowed. Read the reason rather than assuming unknown means permitted. ## Keep the cost of reads in mind A read can still consume CPU, I/O and locks. Timed plan analysis runs the SELECT. Read-only policy is a guard against changes, not a resource budget or guarantee of zero production impact. Use estimated plans first when that is sufficient. Schedule expensive analysis according to your normal operational process. ## Local evidence and credentials Saved investigations and audit events live on your computer. Saved passwords use a local vault in the desktop backend's `.myflames` directory; server data is rendered locally. The app can fetch MySQL and MariaDB news headlines while Home is open. That optional setting can be turned off. SSH connections use your own SSH config, keys and agent. ## Share with care **Hide literal values** replaces SQL and condition literal values with `?` in supported plan exports. It keeps object names, types, counts, measurements and versions. Review the complete artifact before sharing it. Schema comparison and account-export SQL are generated for review, not automatically executed. Audit records omit passwords; the CSV import audit does not record imported row data. --- # Engine & platform compatibility Page: https://myflames.io/docs.html?article=compatibility Markdown: https://myflames.io/docs/compatibility.md # Engine & platform compatibility Desktop: macOS Apple Silicon; Windows x64 is a preview. A Linux or macOS Intel desktop binary is not advertised in the checked release. | Capability | MySQL 5.7 | MySQL 8.0 | MySQL 8.4 and 9.x | MariaDB 10.11+ and 11.x | Percona Server 8.0 and 8.4 / PXC | | :--- | :--- | :--- | :--- | :--- | :--- | | **Offline plan files** | `EXPLAIN FORMAT=JSON` (the `query_block` format; no operator timing) | `EXPLAIN FORMAT=JSON` (cost estimates; no operator timing) | `EXPLAIN ANALYZE FORMAT=JSON` and `EXPLAIN FORMAT=JSON` | `ANALYZE FORMAT=JSON` and `EXPLAIN FORMAT=JSON` | 8.0: `EXPLAIN FORMAT=JSON`; 8.4: `EXPLAIN ANALYZE FORMAT=JSON` | | **Live plans (Explain, Explore, Run analysis)** | Estimated plans only (`EXPLAIN FORMAT=JSON`); Run analysis is refused because 5.7 has no `EXPLAIN ANALYZE` | `EXPLAIN FORMAT=JSON`; Run analysis is refused before sending (`EXPLAIN ANALYZE FORMAT=JSON` is 8.3+) | Estimated and timed plans, schema, statistics, variables and trace | Estimated and timed plans, schema, statistics, variables and trace | 8.0: `EXPLAIN FORMAT=JSON`; 8.4: `EXPLAIN ANALYZE FORMAT=JSON` | | **Query editor, Query digest, Database diagram** | SQL sessions and schema diagrams; Query digest Statement digests have no sample text, quantiles or CPU time on 5.7, and the Slow log table and Slow log file sources work | SQL sessions, digest summaries and schema diagrams | SQL sessions, digest summaries and schema diagrams | SQL sessions, digest summaries and schema diagrams | SQL sessions, digest summaries and schema diagrams | | **Schema versions** | Read, compare, sync script and Export as SQL; Checks leave reserved words Not judged before 8.0.11 | Tables, views, routines, triggers and events from `SHOW CREATE`; sync script; Checks (current reserved words need a live 8.0.11+ connection) | Same (JavaScript libraries of 9.2+ are not read) | Same, plus sequences, packages and system-versioned tables (sequence and versioning changes are listed but not generated); Checks leave reserved words Not judged | Same as MySQL | | **Server views, Processlist, Locks, Tuning** | Server diagnostics; Locks reads `INNODB_LOCKS` and `INNODB_LOCK_WAITS`; Error log gets file guidance; Parameters have no sources and no `SET PERSIST` | Server diagnostics; `performance_schema.error_log` requires 8.0.22+; older 8.0 gets file-viewing guidance | Server diagnostics | `userstat` fallbacks for index usage and table I/O when enabled; Waits requires Performance Schema. `metadata_lock_info` for MDL; verified local error log file or guidance | Server diagnostics plus Percona `userstat` index and table stats, thread-pool metrics, `log_slow_rate_limit` checks and Percona parameter links | | **Replication and Cluster** | Replication (`SHOW SLAVE STATUS`), Group Replication from 5.7.17; reviewed Cluster changes need 8.0.13 | Replication (`SHOW REPLICA STATUS` / `SHOW SLAVE STATUS`), InnoDB Cluster, Group Replication | Replication (`SHOW REPLICA STATUS`), InnoDB Cluster, Group Replication | Replication (`SHOW ALL SLAVES STATUS`, `gtid_slave_pos`), MariaDB Galera Cluster | MySQL Replication, Group Replication, Percona XtraDB Cluster (`wsrep_*`, `pxc_cluster_view`) | | **Users and roles** | Users only (5.7.6+); no roles | Users, roles, default roles, partial revokes and dynamic privileges | Users, roles, default roles, partial revokes and dynamic privileges | Users, MariaDB roles, `SET DEFAULT ROLE` and `PUBLIC` | MySQL privilege and role model | | **Maintenance** | Upgrade check, dump and restore (structure only included); no `CLONE` | Upgrade check (`mysqlsh` or partial native subset), dump, restore, `CLONE` (8.0.17+) | Upgrade check, dump, restore, `CLONE` | Dump and restore (`mariadb-dump`); points to `mariadb-upgrade` and `mariadb-backup` for upgrades and physical copies | Upgrade check, dump, restore, `CLONE` (Percona Server) | For manual MySQL JSON generation on 8.3+, select format version 2 with `SET SESSION explain_json_format_version=2` before EXPLAIN. Timed JSON analysis needs MySQL 8.3 or later (8.4 LTS); on earlier versions myflames refuses it before sending anything. MySQL 5.7 is end of life; myflames reads it and says in plain sentences what 5.7 lacks (roles, `SET PERSIST`, `EXPLAIN ANALYZE`, `CLONE`, `performance_schema.error_log`, invisible indexes). A MySQL 5.6 or older server gets a note that results may be missing or wrong. ProxySQL 2.x and 3.x are supported in the ProxySQL place when connected to a ProxySQL Admin interface. Readyset is supported in the Readyset place when connected to a Readyset SQL adapter (`3307`) or Admin SQL (`6036`) listener, including multi-tier ProxySQL + Readyset + MySQL or MariaDB topologies. --- # Contribute to myflames Page: https://myflames.io/docs.html?article=contributing Markdown: https://myflames.io/docs/contributing.md # Contribute to myflames Start with the [public repository](https://github.com/vgrippa/myflames), [open issues](https://github.com/vgrippa/myflames/issues) and the project's roadmap. Check whether your idea fits the direction before implementing a large feature. ## Helpful contributions - A reproducible bug report with engine and exact version, steps, expected behavior and observed result. - A sanitized execution-plan fixture that captures an unsupported engine shape. - A documentation correction with a link to the relevant source or manual. - A focused patch with tests for changed logic and an explanation of the behavior. Review a plan, log and schema for sensitive information before attaching them to a public issue. ## Development setup ```bash git clone https://github.com/vgrippa/myflames.git cd myflames python3 -m pip install -e . ``` The Python package uses only the standard library. Frontend and desktop development have their own Node build toolchains. Read the current repository instructions before modifying either. ## Validate a change New Python features and logic changes need corresponding tests. Run tests with an isolated temporary HOME and USERPROFILE and `MYFLAMES_SECRET_BACKEND=vault`; never test against your real saved workspace. The repository's `run-tests.sh` is the full Python suite entry point. Features touching engine behavior require live-server validation, and UI changes require browser or packaged-app checks where appropriate. Follow the current AGENTS.md and contributing guide for the specific area. Read [CONTRIBUTING.md](https://myflames.io/docs/ref-contributing.md), the [developer reference](https://myflames.io/docs/ref-developer-reference.md), and [ROADMAP.md](https://myflames.io/docs/ref-roadmap.md). --- # Release notes Page: https://myflames.io/docs.html?article=release-notes Markdown: https://myflames.io/docs/release-notes.md # myflames release notes What changed in each version of myflames, newest first. Changes that are merged but not released yet are listed in [CHANGELOG.md](https://github.com/vgrippa/myflames/blob/master/CHANGELOG.md). - [myflames 3.4.1 (2026-11-11)](https://myflames.io/docs/release-notes-3-4-1.md) - [myflames 3.4.0 (2026-11-11)](https://myflames.io/docs/release-notes-3-4-0.md) - [myflames 3.3.4 (2026-11-10)](https://myflames.io/docs/release-notes-3-3-4.md) - [myflames 3.3.3 (2026-11-09)](https://myflames.io/docs/release-notes-3-3-3.md) - [myflames 3.3.2 (2026-11-05)](https://myflames.io/docs/release-notes-3-3-2.md) - [myflames 3.3.1 (2026-10-31)](https://myflames.io/docs/release-notes-3-3-1.md) - [myflames 3.3.0 (2026-10-23)](https://myflames.io/docs/release-notes-3-3-0.md) - [myflames 3.2.0 (2026-10-23)](https://myflames.io/docs/release-notes-3-2-0.md) - [myflames 3.1.1 (2026-10-22)](https://myflames.io/docs/release-notes-3-1-1.md) - [myflames 3.1.0 (2026-10-20)](https://myflames.io/docs/release-notes-3-1-0.md) - [myflames 3.0.0 (2026-10-16)](https://myflames.io/docs/release-notes-3-0-0.md) Release notes for versions before 3.0 are in the [myflames repository](https://github.com/vgrippa/myflames/blob/master/docs/release-notes/index.md). --- # myflames 3.4.1 Page: https://myflames.io/docs.html?article=release-notes-3-4-1 Markdown: https://myflames.io/docs/release-notes-3-4-1.md # myflames 3.4.1 (2026-11-11) myflames 3.4.1 is available for macOS on Apple Silicon and, as an unsigned preview, for Windows x64. ## Release highlights - Choose from 17 themes, including three new myflames originals (Fire, Digital Rain and Neon Grid) and popular editor palettes such as Dracula, Nord and Tokyo Night. - **Settings** opens as a full page, the sidebar can be resized, and your theme, layout and view choices now stay the same after you restart the app. - **Query editor** suggestions appear as you type, and a selection is easier to see in dark themes. ## New features - Adds 14 themes beside System, Light and Dark: Fire, Digital Rain, Neon Grid, Dracula, Nord, Solarized Light, Solarized Dark, Tokyo Night, Gruvbox Dark, Catppuccin Mocha, Catppuccin Latte, GitHub Light, GitHub Dark and One Dark. Choose one in **Settings > Appearance**, where each card previews its colors, or type **Theme:** in **Search**. Chart, status and connection colors keep their meaning in every theme. - Adds [How-to guides](https://myflames.io/docs.html?article=howto) to the documentation, with short recordings that show multiple cursors and other common tasks step by step. ## Improvements - **Settings** opens as a page with **Appearance**, **Query editor**, **Workspace**, **Updates and news** and **Client tools** sections. Open it from the gear at the bottom of the sidebar, with ⌘, (Ctrl+, on Windows), or from **Search**. - Drag the sidebar's right edge, or use the arrow keys on it, to make the sidebar wider. Double-click the edge to reset it. The width is kept when you restart the app. - The version and the update status, with **Check for updates** and **View releases**, now appear at the bottom of every screen. - **Query editor** suggestions show keywords, functions and names already read from the server as soon as you type. Names that are not read yet join the open list when they arrive, and names already read stay available while they refresh. - Selected text, other occurrences of a selected word and the current **Find** result are easier to see, in light and dark themes and when the editor is not focused. ## Bug fixes - Fixed an issue where the theme, the docked **Server** list, the **Health** refresh choice, the inspector width, the **Explain** format and the **File transfer** view choices reset when the desktop app restarted. ## Packaging notes - The bundled MySQL client is unmodified Oracle code under GPLv2 with the Universal FOSS Exception. Its license ships inside the app, and the GitHub release includes the matching source code (`mysql-8.4.13.tar.gz`). - The adapted theme palettes are credited, with their MIT licenses, in [NOTICE](https://github.com/vgrippa/myflames/blob/v3.4.1/NOTICE). ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html), or this version from [GitHub](https://github.com/vgrippa/myflames/releases/tag/v3.4.1) - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) and the [How-to guides](https://myflames.io/docs.html?article=howto) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). --- # myflames 3.4.0 Page: https://myflames.io/docs.html?article=release-notes-3-4-0 Markdown: https://myflames.io/docs/release-notes-3-4-0.md # myflames 3.4.0 (2026-11-11) myflames 3.4.0 is available for macOS on Apple Silicon and, as an unsigned preview, for Windows x64. ## Release highlights - The **Query editor** adds multiple cursors and suggests the connected server's own keywords, functions, tables and columns as you type. - Hover over a table or column to see its definition, and get a warning before you run `UPDATE` or `DELETE` without `WHERE`. - Fixes a window freeze that a statement with many leading comments could cause in **Processlist** or the **Query editor**. ## New features - Adds multiple cursors, automatic closing of brackets and quotes, and comment and line editing shortcuts to the **Query editor**. Each tab keeps its own undo history, and **Query editor shortcuts** lists the available keys. - Adds suggestions for the connected server's keywords and functions, schemas, tables, columns, aliases, CTE names and system variables. Accepting a function adds its parentheses, and inside a built-in function call a hint shows which argument you are typing and, when known, how many the function takes. - Adds details on hover for tables and columns, and warnings for `UPDATE` or `DELETE` without `WHERE`. After myflames has read a database's full table list or a table's column list, it also flags names that are not in it. ## Improvements - **Settings > Query editor** offers **Multiple cursors**, **Suggestions while typing**, **Close brackets and quotes**, **Wrap long lines**, **Problem warnings** and **Details on hover**, kept on this computer and applied at once. ## Security fixes - Fixed an issue where a statement with many leading comments could freeze an open myflames window, either when another session's statement appeared in **Processlist** or when it ran in the **Query editor**. - Fixed an issue where a slow regular expression could freeze **Find** in the **Query editor**. Searches that take too long stop with **Pattern too slow to search**. - Fixed an issue where a server-controlled name containing right-to-left characters could reorder the suggestion list. Suggestion labels and details now isolate right-to-left text. ## Packaging notes - The bundled MySQL client is unmodified Oracle code under GPLv2 with the Universal FOSS Exception. Its license ships inside the app, and the GitHub release includes the matching source code (`mysql-8.4.13.tar.gz`). ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html), or this version from [GitHub](https://github.com/vgrippa/myflames/releases/tag/v3.4.0) - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). --- # myflames 3.3.4 Page: https://myflames.io/docs.html?article=release-notes-3-3-4 Markdown: https://myflames.io/docs/release-notes-3-3-4.md # myflames 3.3.4 (2026-11-10) myflames 3.3.4 is available for macOS on Apple Silicon and, as an unsigned preview, for Windows x64. ## Release highlights - myflames now updates itself. Install 3.3.4 by hand once, and later versions download and install from inside the app. - The desktop app includes the MySQL 8.4.13 command-line client, so you can connect from a computer that has no MySQL installed. - One rule picks the MySQL or MariaDB client program for each server, and **Settings > Client tools…** shows which program is used and why. ## New features - Adds automatic updates. With **Settings > Check for updates automatically** turned on (the default), myflames checks for a new version shortly after it opens and once a day after that. **Check for updates** on Home and in **About myflames** checks right away. A badge next to the logo shows the download, and **Restart to update** installs it. On macOS, the app must be in an Applications folder to update itself. - Adds a bundled MySQL client. The macOS app and the Windows installer include the official MySQL 8.4.13 LTS `mysql` and `mysqldump` programs, so you can connect without installing a MySQL or MariaDB client first. ## Improvements - **Settings > Client tools…** replaces **Database client…**. For each server, myflames uses the client that matches the server's engine and version, then the nearest newer version, and warns you when it has to fall back to an older one. You can keep **Automatic** or choose an installation, separately for MySQL and MariaDB servers. - **Maintenance > Tools** shows the program each job uses for the current server, where it comes from and why it was chosen, and lists every copy myflames found with its path. - New dumps are saved to **Documents/myflames dumps** by default, or to a folder in your home directory when there is no Documents folder. The dump review tells you when Start will create the folder. ## Bug fixes - Fixed an issue where myflames could not find a MySQL client installed in a common location and stopped with "Cannot find 'mysql' or 'mariadb' on PATH". The search also covers the client that ships with MySQL Workbench on Windows, and on macOS versioned Homebrew formulas such as `mysql-client@8.4`, Laravel Herd and MySQL Workbench. - Fixed an issue where the app stopped with a command-line error when no `mysql` or `mariadb` client was installed. The view that needs a client explains what is missing and offers **Choose client tools…**. - Fixed an issue where Dump and Restore showed a greyed-out **Start** button with no reason when no client could run the job. The tab names the missing program instead. - Fixed an issue where an older installed `mysqldump` was used instead of a bundled copy that matched the server better. SQL restores and CLONE use the client from the selected installation too, and a job refuses to start if the tool changed after you reviewed it. - Fixed an issue where a MariaDB server on a computer without MariaDB tools used an older installed MySQL client instead of the bundled 8.4.13 client. - Fixed an issue where a broken client choice for MySQL servers also blocked MariaDB servers, or the other way round. - Fixed an issue where MariaDB clients received MySQL-only options such as `ssl-mode` and `get-server-public-key`. When a sign-in fails because the client lacks an authentication plugin, the error names the client and the plugin. - Fixed an issue where Restore offered **New database…** for a dump that creates its own databases and then refused at Start. Restore reads the dump first and offers only the targets that can work, with the reason under the field. - Fixed an issue where a dump of selected tables could not be restored after its source database was dropped. The restore creates the database first, with the source character set and collation when the dump recorded them. - Fixed an issue where SQL `INSERT` exports quoted integer and decimal values. When a result comes from plain columns of one table, numbers are written without quotes. - Fixed an issue where the Query editor offered **Explain analyze** for statements it cannot analyze, such as `SET` and `SHOW`. - Fixed an issue where the Query editor's **Database** list missed databases created or dropped from the editor. - Fixed an issue where **Auto-commit** overlapped the Run analysis note in the Query editor toolbar. The toolbar wraps onto a second row when its items do not fit. - Fixed an issue where starting **Refresh every view** from a view's Refresh menu dropped keyboard focus on the page. Focus moves to the run's **Stop** button. - Fixed an issue where Home showed "Not checked" next to "In use" for a server whose readiness had not been read. The cell shows a dash, and its tooltip points to **Check now**. - Fixed confusing counts in the Server views. Indexes says "6 tables read by full scans (3 mostly)" instead of "3 mostly full scans", and Processlist labels its counters **Server-wide** because they include monitoring and background threads. - Fixed several Maintenance issues. Choosing another database resets the Dump table selection, the Dump and Restore database lists are read again when they open, Upgrade check no longer preselects a target that the installed MySQL Shell cannot check, and **Maintenance > Tools** marks every copy in use. ## Security fixes - myflames now checks installed client programs before it runs them. On macOS and Linux, a program or folder that other users can change is refused. On Windows, only programs in Program Files or your user profile are used. Refused copies stay in the list with the reason. ## Known issues - Windows builds are an unsigned preview, so Windows shows an "Unknown Publisher" warning when the installer runs. Until the installer is signed, updates on Windows are verified with the checksum published with each release. - Starting **Refresh every view** from a view's Refresh menu can still leave keyboard focus on the page after some redraws. Press Tab to reach the toolbar again. - The bundled MySQL client cannot sign in to MariaDB accounts that use `ed25519` or `parsec`, or to servers that require Kerberos, LDAP SASL, OCI or WebAuthn authentication. Install the MariaDB or MySQL client tools for those servers. ## Packaging notes - The macOS DMG is about 7 MB larger because it includes the MySQL client. - The bundled MySQL client is unmodified Oracle code under GPLv2 with the Universal FOSS Exception. Its license ships inside the app, and the GitHub release includes the matching source code (`mysql-8.4.13.tar.gz`). ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html), or this version from [GitHub](https://github.com/vgrippa/myflames/releases/tag/v3.3.4) - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). --- # myflames 3.3.3 Page: https://myflames.io/docs.html?article=release-notes-3-3-3 Markdown: https://myflames.io/docs/release-notes-3-3-3.md # myflames 3.3.3 (2026-11-09) myflames 3.3.3 is available for macOS on Apple Silicon and, as an unsigned preview, for Windows x64. ## Release highlights - The Query editor opens and saves `.sql` files, finds and replaces text, compares results, and shows what the server did for each statement. - Top statements and Query digest suggest indexes, and measure the statement again after you create one. - Processlist shows who blocks whom, starting from the root blocker. - Health and Query digest can save a baseline and show what changed since. ## New features - Adds a list of target versions to **Upgrade check**, read from MySQL's release notes and Percona's package repositories. It offers only releases on a supported upgrade path, newest first, and explains how the server was installed (RPM, DEB or a generic archive) and what that means for the upgrade. Offline, MySQL targets come from the releases bundled with myflames. - Adds suggested indexes to **Top statements** and **Query digest**. For a statement that uses no index or a full scan, **Read suggestion** runs `EXPLAIN` and checks the existing indexes, and you can copy the suggested `CREATE INDEX` or open it in the Query editor. - Adds **Measure the statement again** to the Query editor tab that created a suggested index. It runs the statement once with Run analysis and compares its time and rows examined with the digest averages from before the change. - Adds a blocking graph to **Processlist**. Each session shows whether it is a **Root blocker**, which session it waits on and how many sessions it blocks, and the inspector follows the chain and lists up to ten recent statements. - Adds server counters to every Query editor run: rows examined, returned and changed, index use, temporary tables on disk and sort merge passes. An open transaction shows its age, the rows it changed and how many sessions wait on its locks, with **Commit**, **Roll back** and **Show who waits**. - Adds filters to query results. Search the loaded rows or show and hide a column value, and selection totals, copy and export follow the filter. - Adds **Pin result** and **Compare with pinned**. Pin up to 5,000 rows of a result, run the query again, and see the added, removed and changed rows matched by a key column you choose. - Adds find and replace to the Query editor: `⌘F` for Find and `⌥⌘F` for Find and replace (`Ctrl+F` and `Ctrl+H` on Windows), with **Match case**, **Whole word** and **Regular expression**. - Adds **Open SQL file…**, **Save** and **Save as** to Query editor tabs, for `.sql` and `.txt` files up to 5 MiB (`⌘O`, `⌘S` and `⇧⌘S`). A tab with unsaved edits asks before it closes. - Adds **On error: Stop / Continue** to **Run all**. With Continue, the run goes on after a failed statement and then counts the statements that succeeded, failed or did not run. - Adds a **Database** choice to each Query editor tab. It sets the tab's default database and is kept when the workspace restores your tabs. - Adds Back and Forward across views, query tabs and plans with `⌘[` and `⌘]` (`Ctrl+[` and `Ctrl+]`, or `Alt+Left` and `Alt+Right`, on Windows). Following a link between views shows a **Back to …** chip in the top bar. - Adds object search to `⌘K` (`Ctrl+K`). Type two or more characters to find databases, tables, views, procedures, functions, triggers and events on the current connection. Routines, triggers and events open their `SHOW CREATE` statement in a new tab without running it. - Adds **Routines**, **Triggers** and **Events** folders to each database in the Query editor's **Schemas** panel. - Adds **Workload > Resources > Memory**, which shows tracked memory by category, session and account, the top events and growth over a sampling window. On MariaDB it can show allocator and session memory with Performance Schema off. - Adds **Save baseline** and **Compare with baseline** to Health and Query digest. Health shows each tile's earlier value, and Query digest shows statements that are new or whose average latency or calls per second grew by more than 50%. Baselines stay on your computer. - Adds **Changed through myflames** to Parameters and to Users and roles. It shows the last change you made to that object from myflames, with its SQL and a link to the Audit log entry, and simple parameter changes offer **Undo**. - Adds misestimate marks to measured plans. Operators whose actual row count is 10 times or more off the optimizer's estimate are marked in Visual Explain, the execution tree, the bar chart and the flame graph, and **Misestimates** steps through them worst first. For a plan captured in the Query editor, the inspector shows when the table's statistics were last updated and an `ANALYZE TABLE` statement to copy. - Adds connection readiness to Home's Connections list: the last product, version, replication or cluster role, read-only state and Performance Schema state myflames saw for each server. **Check now** reads them again. - Adds import of MySQL and MariaDB connections from MySQL Workbench and DBeaver, without passwords. The preview unchecks duplicates, and imported connections use the Production policy and never connect on their own. ## Improvements - Top statements says which server setting cut off a statement's text, with its value, a suggested value and about how much Performance Schema memory the change costs. It gives the option-file lines and, on MySQL 8.0 and later, the `SET PERSIST_ONLY` statements to copy. - Health refreshes itself while the view is on screen. It waits one sampling interval after each read, pauses when the window is hidden and backs off after a failed read. **Off** and fixed 10, 30 and 60 second intervals are still available. - **Tables** replaces Free space with **Fragmentation**, ranking InnoDB tables by reclaimable space. A selected table offers `OPTIMIZE TABLE` and `ALTER TABLE ... ENGINE=InnoDB` to copy or open in the Query editor, with notes on online rebuilds, disk space and replicas. - Maintenance shows a running dump, restore or clone as it goes: a progress bar, the current step, bytes written, rate and elapsed time. For `mysqldump` and `mariadb-dump` the percentage is an estimate. A finished dump offers **Open in Finder** (**Open in File Explorer** on Windows). - Query editor tabs look like tabs, with a border, rounded corners and an accent bar on the selected one. - Refreshes the myflames logo, wordmarks and desktop app icon. ## Bug fixes - Fixed an issue where a long open-transaction indicator pushed **Run**, **Run all** and **Stop** out of view. Results also keep their rows visible in the smallest window when a statement's server counters are shown. - Fixed an issue where object search and the **Schemas** folders failed on object names that contain control characters. - Fixed an issue where **Maintenance > Dump** with `mysqldump` or `mariadb-dump` showed only "Running" and an empty log until the dump finished. ## Deprecations and removals - The Python command line is deprecated. Every command, flag and output format keeps working and gets fixes until a future major release removes it, and new features go to the desktop app only. Each command prints one notice on standard error, which `MYFLAMES_NO_DEPRECATION_WARNING=1` hides. - The `myflames-mcp` agent tools are deprecated along with the command line. They keep working, and no new tools will be added. ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html), or this version from [GitHub](https://github.com/vgrippa/myflames/releases/tag/v3.3.3) - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). --- # myflames 3.3.2 Page: https://myflames.io/docs.html?article=release-notes-3-3-2 Markdown: https://myflames.io/docs/release-notes-3-3-2.md # myflames 3.3.2 (2026-11-05) myflames 3.3.2 is available for macOS on Apple Silicon and, as an unsigned preview, for Windows x64. ## Release highlights - **Readyset** shows caches, query counts and latency percentiles for Readyset instances, and makes reviewed cache and runtime changes. - **File transfer** moves files between this computer and your servers over SSH and SFTP. - The Query editor explains a statement without running it, in Table, Tree or JSON format. ## New features - Adds a **Readyset** place in the sidebar, after ProxySQL. It inspects Readyset instances through their SQL and admin ports (default 3307 and 6036): shallow and deep caches, cached versus upstream query counts, latency percentiles up to P99.9, shallow cache hit rates, background refreshes, proxied queries with support verdicts, replicated base tables, client sessions and replication lag. - Adds reviewed Readyset changes. Creating, dropping and flushing caches, `ALTER READYSET` runtime settings, base-table recovery (`RESNAPSHOT TABLE`, stopping and starting replication) and the admin-only `SHUTDOWN` go through the exact SQL review, policy gates and the Audit log, with a dry-run `EXPLAIN CREATE CACHE` before a cache is created. - Adds topology views across Readyset, ProxySQL, Replication and Cluster. Saved ProxySQL, Readyset and MySQL or MariaDB servers, replicas and clusters appear in one picture, including ProxySQL rules that route or mirror to Readyset, and you can switch between a tier's saved connections. - Adds **File transfer**, a place in the sidebar after Tuning for moving logs, dumps and configuration files between this computer and your servers over SSH/SFTP. Saved SSH connections sit on the left, with a **This computer** pane and a server pane side by side and a Transfers panel below. It does not use the database connection in use. - Adds saved SSH connections for File transfer. They sign in with the SSH agent or `~/.ssh/config`, a key file with an optional passphrase, or a password. The first connection to a server shows its host key fingerprints before **Trust and connect**. Trusted keys go to myflames' own `ssh_known_hosts` file, and a server whose key changed is refused with the file and line of the trusted key. - Adds background transfers to File transfer. Transfers handle folders, ask before replacing existing files, and run in the background with progress, rate and time left, with **Cancel** and **Retry**. Drag rows between the panes, or drop files and folders from the Finder onto the server pane. - Adds **Explain** to the Query editor. It runs `EXPLAIN` on the statement as written, without running it, so an `UPDATE` or `DELETE` can be explained on any connection. The **Explain format** menu picks **Table**, **Tree** (MySQL 8.0.16 and later) or **JSON**, and the answer opens in an **Explain** results tab. - Adds **Run in this tab's session** when a plan capture fails because the query needs the tab's session, for example a temporary table, a user variable or a prepared statement. The plan is captured on the session the tab already has open and is marked "Captured in the tab's session". ## Improvements - The workspace restores your previous session quietly, and **Start fresh** moved into Settings with a confirmation. - Error and note banners (query errors, session notes, configuration notices) have a close button. - Replication and cluster topologies are drawn with depth, with nodes you can select and motion controls that respect the system's reduced-motion setting. - In Maintenance, each task has one button named for it (**Start dump…**, **Start restore…**, **Start clone…**) that runs its checks first, a failed check names a next step, and the output folder is pre-filled with a dated name that does not exist yet. - **Refresh all** moved into the menu beside each view's Refresh, and the database and table pickers now say **Reload databases** and **Reload tables**. - The documentation has a user handbook, also published on the myflames website. ## Bug fixes - Fixed an issue where a `SHOW` statement with a subquery in its `WHERE` clause (such as `SHOW TABLES WHERE GET_LOCK(...)`) and `HANDLER ... READ` were treated as unconditional reads, bypassing the write policy's function and subquery checks. They now go through the same review as `SELECT`, and `GET DIAGNOSTICS` is no longer treated as read-only. - Fixed an issue where `EXPLAIN` and `DESCRIBE` counted as a plain read even when the explained statement takes a named lock, assigns a user variable, advances a sequence, uses a locking clause or calls an unverified function, parts the server can evaluate while it plans. Such statements now get the same review as under **Run**, and a read-only connection refuses them. - Fixed several plan display issues: an unusual `EXPLAIN` tree no longer crashes plan parsing, the bar chart no longer draws past its frame, the Digest vitals no longer show a missing value when a plan's total time is exactly 0 ms, and CREATE INDEX suggestions quote schema and table names that need it. ## Security fixes - Every MySQL client that myflames starts passes `--local-infile=0`, so a hostile or compromised server cannot make the client read a local file and send it over (`LOAD DATA LOCAL INFILE` abuse). ## Known issues - On Windows, File transfer cannot upload or download yet, and its buttons say so. ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html). Version 3.3.2 was not published as a separate download. Its changes ship in 3.3.3 - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). --- # myflames 3.3.1 Page: https://myflames.io/docs.html?article=release-notes-3-3-1 Markdown: https://myflames.io/docs/release-notes-3-3-1.md # myflames 3.3.1 (2026-10-31) myflames 3.3.1 is available for macOS on Apple Silicon and, as an unsigned preview, for Windows x64. ## Release highlights - Schema versions saves database definitions, compares them across servers and writes the script that makes one match the other, with warnings for changes that drop data or rebuild a table. - Connections can go through an SSH tunnel. - Query digest reads slow query logs and filters any source by time range. - MySQL 5.7 works across the Server views, the Query editor and Users and roles. ## New features - Adds **Schema versions**, which saves database definitions on this computer and compares two saved versions or live databases, also across servers. Differences are shown side by side, and **Sync script** writes the SQL that changes the **Target** to match the **Source**, ready to copy, download or open in the Query editor. - Adds **Include in sync script**, to choose which objects a schema comparison changes. Objects that exist only in the target start unselected. - Adds schema change warnings: **Drops data**, **May fail** and **Rebuilds table**, repeated as comments in the sync script. For `ALTER TABLE`, myflames predicts the algorithm and whether writes can continue during the change. - Adds **Checks** for saved schemas, which look for risky column types, old character sets, reserved names, and foreign key and definer problems. - Adds **Export as SQL** to Schema versions, to recreate a schema on another server. Tables and views come in dependency order, with routines, triggers and events, and definers are left out by default. - Adds **Compare** to Parameters and to Users and roles, to see what differs between two servers. Parameters can also compare saved snapshots (**Save snapshot…**). Password hashes and secret parameter values are left out. - Adds **Export grants as SQL** for selected accounts and the roles they need: `CREATE USER IF NOT EXISTS` without passwords, then the grants and default roles. - Adds **Parameters > Versions**, to compare system variables between MySQL and MariaDB releases and trace one parameter's history. It covers MySQL GA releases from 5.7.9 and stable MariaDB releases from 10.6. Percona Server uses the MySQL catalog, so Percona-only variables are not included. - Adds **Import CSV…** for `.csv`, `.tsv` and `.txt` files, into an existing or a new table, with a preview that checks the rows first. It uses `INSERT` unless the server already allows `LOAD DATA LOCAL`, and you choose the transaction size and whether a bad row stops the import. - Adds **Save query…** and a **Saved** tab next to History, with folders, notes and search. It keeps up to 500 queries on this computer, and opening one creates a tab without running it. - Adds cell, range, row and column selection to query results, with totals of the selected numbers under the grid. `⌘C` (`Ctrl+C`) copies the selection as tab-separated text, and **Show row** shows a row's typed values and formatted JSON. - Adds **Fill in the values of** for statements opened from Top statements or Query digest. It shows each placeholder in its SQL context and takes a number, text or NULL, including lists for `IN (...)`. - Adds `ALTER TABLE` predictions to Query editor reviews, also used in the Tables and Indexes write reviews: the expected algorithm, whether the table is rebuilt and the effect on concurrent writes, for MySQL 8.4 and 9.x and MariaDB 10.11 to 13.0. - Adds DDL progress to **Processlist** and the Query editor: the stage, percentage and estimated time left, when the server reports them. **Follow progress** keeps the session list refreshing. - Adds **Connect through SSH**, which uses the system `ssh` with your SSH configuration, keys and agent. Queries, dumps, restores and upgrade checks all go through the tunnel, which closes when idle or when myflames quits. SSH password sign-in is not supported. - Adds **Slow log table** and **Slow log file** sources to Query digest. They group MySQL, Percona Server and MariaDB slow log entries by statement, with timing, lock time and rows, and a local file can be read without a server connection. - Adds **Time range** to Query digest, with a calendar and quick ranges. With Performance Schema it filters by when statements were seen, and their counters stay totals since collection began. - Adds server-wide totals to Query digest, including the time and calls of statements outside the loaded list, and a **New** badge for recent statements. On MySQL the inspector adds latency percentiles and a histogram. - Adds a **Tables** section to the Query digest inspector, with the engine, size and indexes of each table the statement names, and **Open in Indexes**. - Adds live charts to Health for query rate, running threads, buffer pool disk reads and connections in use. - Adds **Capture when…** to Health. While the view is open, it watches for too many running threads, long row lock waits or long-running statements, and saves the processlist, InnoDB status and locks as an investigation when one happens. - Adds **Stats** to Plans, which ranks time by table or operator type and highlights the matching operators in the charts. **All occurrences** in the operator inspector lists every operator of the same kind with its measurements. - Adds **Hide literal values** to Plans exports, on by default. Shared HTML and JSON replace literal values and comments with placeholders and keep names and measurements. - Adds **Table structure** to **Server > Tables**: columns, indexes, foreign keys and the exact `SHOW CREATE TABLE`, which you can copy or download as a `.sql` file. - Adds **Structure only (no rows)** to logical dumps in Maintenance. - Adds guided steps, simplified code, **Check yourself** quizzes and **Explore** to all 23 Learn lessons. **Next step** moves one idea at a time, Play runs the rest, and **Full screen** scales the drawing to the display. - Adds engine choices to Learn examples. Filesort can show MySQL or MariaDB behavior, including MariaDB's radix sort, and Buffer pool warmup explains how each engine picks the pages to load. ## Improvements - **New connection…** is in the connection picker, and pasting a `host:port`, `[IPv6]:port` or `mysql://` URL fills in the form. **Test connection** fills the database list. - The connection in use is shown as a colored strip while you work and as a band on every write review. Home and the Audit log show the connection type and Read-only separately. - The Audit log shows readable status names, local times and a Copy button per statement, and records the SSH target of writes made through a tunnel. - Database and object fields in the Server views and Maintenance forms offer lists read from the server. Restore can pick an existing or a new database, Clone can fill the donor from a saved connection, and Parameters shows checkboxes for settings such as `sql_mode`. - Connection errors start with a plain explanation and what to check, followed by the client's own message. - Query digest shows coverage notes and loaded totals, exports text and CSV, and uses the server's clock for statement times. - Parameters keeps comparisons, snapshots and staged edits when you switch to another Server view, and fits narrow windows by showing the name, value, apply type and source first. - Comparisons in Schema versions, Parameters and Users and roles share one **Source** and **Target** bar with **Swap** and **Change…**, and clearer difference badges. - Learn opens with the drawing and its controls in view, with the query and explanation under **About this example**. - Locks, Plans and the Query editor fit narrow windows better. Lock descriptions wrap, the plan chart takes more room when no operator is selected, and the editor shows one bottom panel at a time. - Table lists keep **Columns** outside the horizontal scroll area, and **Filter tables** sits next to paging and export. - In Settings, screen readers announce the explanations of **Restore workspace on startup** and **Show MySQL and MariaDB news on Home** together with their switches. ## Bug fixes - Fixed an issue where MySQL 5.7 servers were rejected with a message asking for MySQL 8.4 or later. MySQL 5.7 works, and the features it lacks are explained in plain sentences. MySQL 5.7 is end of life and has been in Oracle Sustaining Support since October 25, 2023. - Fixed an issue where Tables, Indexes and Parameters failed on MySQL 5.7. Locks and Replication also read 5.7 correctly, and parameter changes and tuning advice use settings that 5.7 accepts. - Fixed an issue where privilege reads failed on MySQL 5.7, which broke Table data and account actions. Users and roles works from MySQL 5.7.6 and explains that 5.7 has no roles. - Fixed an issue where **Run analysis** sent unsupported SQL to MySQL before 8.3 and showed a server error. On those versions the action is disabled with the reason. Use **Explain** instead. - Fixed an issue where Database diagram did not make it clear how to load the selected database. **Load** names the action, and loading another database asks before replacing the diagram. - Fixed an issue where a changed saved connection did not show in other connection lists until a reload. Duplicate names, including ones that differ only in case or spaces, are refused under the name field. - Fixed an issue where spaces pasted around a host name caused an unknown-host error. - Fixed an issue where Users and roles gave the wrong privilege advice for Drop and Rename on some versions. - Fixed an issue where Query digest table and histogram reads stalled after you switched connections. - Fixed an issue where hidden result columns were included in selections, totals, copied text and arrow-key movement. - Fixed an issue where the parameter form changed values you had not edited. - Fixed an issue where **Hide literal values** could not be used from the keyboard. - Fixed an issue where the Query editor refused **Add column…** and **Remove column…** from Tables. They open the change for review. - Fixed an issue where schema Checks needed MySQL 8.0.13 for reserved-word checks. They work from 8.0.11, and `QUALIFY` is treated as reserved from MySQL 8.3.0. - Fixed an issue where the ALTER review offered `ALGORITHM=INPLACE, LOCK=NONE` for a change predicted to run instantly. On MySQL that rewrite can turn an instant column change into a table rebuild, so it is no longer offered. - Fixed an issue where leaf rows in the execution tree had a blank total time. - Fixed an issue where Visual Explain opened with text too small to read. Fit keeps text at 11 px or larger and starts at the plan's first inputs. - Fixed several Learn lessons whose drawings or counters did not match their examples, among them the index lookup, join, Filesort, Buffer pool warmup, InnoDB LRU and Join order search lessons. Filesort no longer stops with a script error. ## Security fixes - Connections through different SSH hosts are treated as different servers for saved passwords, write policy, editor sessions and schema history, and write reviews name the SSH target. - `CLONE INSTANCE` is refused when either connection uses SSH, because the recipient must reach the donor directly. Remote file and backup checks treat tunneled connections as remote servers. ## Deprecations and removals - Query digest no longer offers the **Slow queries over 1 s** ranking. Use the **Slow log table** or **Slow log file** source instead. ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html), or this version from [GitHub](https://github.com/vgrippa/myflames/releases/tag/v3.3.1) - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). --- # myflames 3.3.0 Page: https://myflames.io/docs.html?article=release-notes-3-3-0 Markdown: https://myflames.io/docs/release-notes-3-3-0.md # myflames 3.3.0 (2026-10-23) myflames 3.3.0 is available for macOS on Apple Silicon and, as an unsigned preview, for Windows x64. ## New features - Adds an unsigned Windows x64 preview of the desktop app. The installer needs no administrator prompt and installs per user. On Windows the app also finds the MySQL and MariaDB clients their installers place under Program Files, which those installers do not add to PATH. ## Bug fixes - Fixed an issue where ProxySQL Query digests could not evaluate any rule pattern on Windows and reported every pattern as unknown. - Fixed an issue where the error log hint for a MariaDB server on Linux lost its `/` path when myflames ran on Windows. - Fixed an issue where keyboard shortcut hints showed the macOS symbols (⌘K, ⌥⌘R, ⌥⌘I) on Windows and Linux. They now read Ctrl+K, Ctrl+Alt+R and Ctrl+Alt+I. - Fixed an issue where Windows showed a scroll bar down the whole window. The narrow icon rail also hides its scroll bar on short windows now. ## Known issues - The Windows build is an unsigned preview: Windows SmartScreen asks before the first run, quitting the app force-stops its backend, and after a crash a statement already running on the server keeps running until it ends. ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html), or this version from [GitHub](https://github.com/vgrippa/myflames/releases/tag/v3.3.0) - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). --- # myflames 3.2.0 Page: https://myflames.io/docs.html?article=release-notes-3-2-0 Markdown: https://myflames.io/docs/release-notes-3-2-0.md # myflames 3.2.0 (2026-10-23) myflames 3.2.0 is available as a desktop app for macOS on Apple Silicon and as a Python package (Python 3.7 or later). ## Improvements - The macOS app is signed with a Developer ID and notarized by Apple, so it opens from Finder without Control-click or removing the quarantine attribute by hand. - Durations read as "36 s", "4 min 12 s" or "18 d 12 h" in Processlist, Locks, Transactions, Replication and the Query editor's ALTER review, with the exact seconds on hover. Processlist also shows the server's State in its own column. ## Packaging notes - The macOS app ships as a DMG, `myflames-3.2.0-macos-arm64.dmg`. Builds you make yourself stay unsigned. ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html). Version 3.2.0 was not published as a separate download. Its changes ship in 3.3.0 - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). --- # myflames 3.1.1 Page: https://myflames.io/docs.html?article=release-notes-3-1-1 Markdown: https://myflames.io/docs/release-notes-3-1-1.md # myflames 3.1.1 (2026-10-22) myflames 3.1.1 is available as a desktop app for macOS on Apple Silicon and as a Python package (Python 3.7 or later). ## Release highlights - **Cluster** shows Galera, Percona XtraDB Cluster, InnoDB Cluster and Group Replication members, with reviewed member actions. - **ProxySQL** connects to ProxySQL's Admin interface and shows backend servers, hostgroups, query rules and query digests, with reviewed changes. - Percona Server for MySQL is supported, and myflames reads what Percona adds. - **Check for updates** tells you when a newer myflames is available. ## New features - Adds support for Percona Server for MySQL. Percona Server and Percona XtraDB Cluster are named by their product everywhere a server is named, and what Percona adds is read when the server reports it: user statistics for index and table activity, thread pool counters in Health, the slow log sampling rules, and a Percona tag on the parameters only Percona has. - Adds **Check for updates** to Home's version footer and to About myflames. It asks GitHub only when clicked, then shows Up to date, the newer version with **Download…**, or why it could not check. - Adds **Cluster**, a place of its own after Replication. For MariaDB Galera Cluster, Percona XtraDB Cluster, MySQL InnoDB Cluster and plain Group Replication it shows the members as the connected server sees them, with one severity scale for every kind, a topology picture, and an inspector per member and router. - Adds reviewed changes in a cluster member's inspector: **Make primary…**, stopping and starting Group Replication, switching a Group Replication group between single- and multi-primary mode, and on MariaDB Galera **Desync this node…**, **Resync this node…** and **Bootstrap a Primary component…**. Destructive changes ask you to type the target's name. - Adds **ProxySQL**, a place of its own for a connection to ProxySQL's Admin interface (2.x and 3.x). It lists each backend server with its hostgroup, status, weight, connections and errors, plus hostgroups, query rules and query digests, each with an inspector. - Adds reviewed ProxySQL changes: set a server ONLINE, OFFLINE_SOFT or OFFLINE_HARD, change its weight, move it to another hostgroup, or enable and disable a query rule. **Save to disk…** and **Load to runtime…** are separate reviewed steps that list every difference between memory, runtime and disk first. - Adds orders and filters to ProxySQL Query digests (slowest, most time, most frequent, highest rate or most rows sent, filtered by hostgroup, schema, user or text). Each digest shows **Ran on** and **Rules send to**, cross-checked against the active query rules, and a different hostgroup is flagged as a mismatch with its possible reasons. - Adds an explanation of safe updates beside **Run options** in the Query editor: what `sql_safe_updates` refuses, when it is on for the tab's session and how to turn it off, with links to the MySQL and MariaDB documentation. - Adds a menu to each Query editor tab (right-click or Shift+F10): **Rename…**, **Duplicate**, **Close** and **Close others**. Close others skips a tab with a running statement and asks before closing one whose transaction is open. - Adds **Format SQL** to the Query editor (Shift+Option+F, or the indent button in the toolbar). It lays out the selection or the whole tab as one undo step and never runs SQL. If the result would change anything besides white space and keyword case, it is refused and the line is named. - Adds MySQL and MariaDB news on Home: up to six headlines from Planet MySQL and the MariaDB Foundation, read over HTTPS only while Home is open and cached for six hours. Turn it off in Settings, and nothing is read. - Links every parameter in Server > Parameters to its entry in the official MySQL, MariaDB or Percona manual for the server's version, from the inspector's **Documentation** or the row menu's **Open documentation**. - **Maintenance > Dump** lists the tables of a chosen database, with engine, estimated rows and size, so a table dump sends exactly the ticked names. ## Improvements - Every action in the workspace gives feedback: the button that starts an action shows what it is doing, a slow answer offers Stop, and the result stays on screen. Reviewed Cluster and ProxySQL changes show each step and each statement's state in the same sheet, then what changed and the Audit log record. - Replication reads **Not a replica** for a server with no asynchronous replication channel, and offers **Open Cluster** for a group member or a Galera node. It also shows each source's engine and version, read from the replica's relay log or through a saved connection. - Query digest and Database diagram have their own places in the sidebar's SQL workspace group. - Top statements and Error log read their data when they open, once per connection, like every other view, so there is no Load button any more. - Adds a context menu to Processlist rows with Show plan, Open in Query editor, filters, Copy query, and **Kill query…** and **Kill connection…**. The Mass kill button is renamed **Kill sessions…**. - Server > Parameters' inspector is one compact section: a one-sentence description, the documentation link and the current value, with a recommendation only when a check flags the parameter. - **Maintenance > Dump** is a two-column form, with the tool's options grouped as Performance, Contents, SQL output and Compression. - Narrow windows work better: between 651 and 900 px a 48 px icon rail with tooltips replaces the sidebar, summary tiles fold into one compact strip, and Replication, Parameters and ProxySQL details open in a side inspector while their lists stay on screen. - Production connections are purple and Development connections teal, so red only means Problem and green only OK. - The Tuning grade explains itself where it is shown, with the scale (A 90 and above, down to F below 50) and why a problem caps the grade at C. - The Full analysis's Galera check uses the Cluster place's rules, so a Primary component of one or two nodes is Watch and a MariaDB node with `wsrep_on` OFF is a Problem. - Privileges moves from the top bar into the connection picker's menu as **Account and privileges…**, and About myflames names what the app contacts and when in one privacy line. ## Bug fixes - Fixed an issue where host-and-port connections, including localhost, could use a Unix socket. They use TCP, and a Unix socket only when you choose one. - Fixed an issue where a confirmation sheet whose request never answered could trap the window. After ten seconds Cancel becomes Close, and the outcome shows in the view when it arrives. - Fixed an issue where the Query editor stopped with "Maximum update depth exceeded" when its text was replaced outside typing, for example by **Format SQL**. - Fixed an issue where a reviewed SQL action or a table data Apply refused by the server was shown as an unknown outcome. It shows as failed, in the server's words. - Fixed several Kill issues: an accepted Kill whose check afterwards fails reports "Sent; could not verify", Kill sessions no longer reports "Nothing was sent." after a successful bulk kill, a Kill's answer in Locks shows at once, and Kill requests for Group Replication's own connections are refused with the reason. - Fixed an issue where partitioned-table indexes could be listed as unused. They are kept out of the Unused list on MySQL, MariaDB and Percona Server. - Fixed an issue where `HANDLER OPEN` needed no write confirmation even though it holds a metadata lock until `HANDLER CLOSE` or the session ends. It needs confirmation now, and `HANDLER READ` and `HANDLER CLOSE` stay reads. - Fixed an issue where a MariaDB server was not recognized as MariaDB when only its version comment said so, including a plain version string such as 11.4.13. The Query editor also detects a MariaDB session when the server's version string is customized. - Fixed several ProxySQL digest issues: cached reads are read again after a reviewed change so routing reflects the current rules, digest hash filters accept lowercase and mixed-case hashes, and routing shows Not judged with the reason instead of a false match when a runtime variable cannot be read. - Fixed an issue where the Error log view failed on MySQL before 8.0.22. The view says the log is not available there and how to read the file instead. - Fixed an issue where Check for updates and other HTTPS reads failed certificate verification in the packaged macOS app on a Mac without Homebrew's OpenSSL. When OpenSSL finds no certificate authorities, myflames also trusts the roots macOS trusts, and update downloads have an overall deadline. - Fixed several small layout issues: popovers no longer hide under the window footer, the Replication topology popover is no longer cut off, Database diagram relationship lines no longer appear joined at crossings, and refreshed table rows are remeasured so larger numbers fit their columns. ## Deprecations and removals - Removes the optional 3D view of the B+tree lesson from Learn, with its 2D | 3D switch. The 2D lessons are unchanged. ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html), or this version from [GitHub](https://github.com/vgrippa/myflames/releases/tag/v3.1.1) - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). --- # myflames 3.1.0 Page: https://myflames.io/docs.html?article=release-notes-3-1-0 Markdown: https://myflames.io/docs/release-notes-3-1-0.md # myflames 3.1.0 (2026-10-20) myflames 3.1.0 is available as a desktop app for macOS on Apple Silicon and as a Python package (Python 3.7 or later). ## Release highlights - myflames ships as a macOS desktop app for Apple Silicon, with everything it needs inside, so it runs without a Python installation. - The new **Tuning** place scores the server's configuration and health and gives the `SET` statements to fix what it finds. - **Server > Parameters** replaces Configuration: filter every variable, stage changes and apply up to 25 of them in one reviewed batch. - The Query editor completes SQL as you type, and a table data browser lets you edit rows through a reviewed batch. ## New features - Adds the myflames desktop app for macOS on Apple Silicon. It opens from Finder without a system Python, finds installed MySQL and MariaDB clients in the usual macOS locations, and keeps its data separate from the command line. - Adds **Tuning** to the sidebar, with **Scorecard** and **Full analysis** tabs. The scorecard grades 19 checks in five weighted categories (Buffer pool and redo, Queries, Connections and threads, Tables and caches, Security), with `SET PERSIST`, `SET GLOBAL` or `SET SESSION` statements to copy and export to HTML, Markdown or JSON. - Adds **Server > Parameters**, which replaces Configuration and works like an AWS RDS parameter group. Filter by **Modified**, **Dynamic**, **Static**, **Recommendations** or **Pending**, edit values in place, and review and apply up to 25 changes at once. - Adds **Server > Overview > Error log**. On MySQL it reads `performance_schema.error_log`, with level and text filters, entries from the previous run and the most frequent error codes. On MariaDB it reads the log file when the server runs on the same computer. - Adds SQL completion to the Query editor for keywords, databases, tables, columns and table aliases, from the connected server's metadata. - Adds a table data browser. Stage row inserts, updates and deletes, review the SQL, and apply them as one batch on supported InnoDB tables. Other tables open read-only. - Adds a read-only view of write statements in the Query editor and Top statements. For a supported write, myflames prepares the matching `SELECT` for review, so you can explain it without running the write. - Adds full table and index lists to **Tables** and **Indexes**, with paging and CSV, HTML and PDF export. - Adds a **Diagram | Mermaid** switch to Database diagram, with the Mermaid code beside the drawing, **Copy** and **Download .mmd**. A diagram can be rebuilt from the connected server, keeping your table positions. - Adds a picker to **Server > Instruments** for Performance Schema features, instruments, consumers, actors and objects. Select up to 2,000 items and turn them on or off in a reviewed batch, with the option-file lines to copy. - Adds a reviewed **Optimize table** action. - Adds dump options to **Maintenance > Dump** (compression, chunking, rate limit and which schema objects to include) and a native folder picker. **Maintenance > Tools** links each detected tool to its official download. ## Improvements - The workspace opens faster and handles large plans better. Views load the first time you open them, and Home and the investigation library load in pages with **Load more** and search. - Plans charts fill the window and redraw when it or a **Compare** pane is resized. A plan with warnings opens its inspector on **Findings**, and bar chart colors show each operator's share of the plan time. - **Compare** describes speed changes as plain ratios such as "2x faster" or "750x slower", shows each plan's total time, and explains how it matched operators between the two plans. - **Replication** has its own place in the sidebar, with a topology diagram per channel, summary tiles for state, lag and GTID mode, and skip actions only when a channel's applier has stopped or has a failed transaction to skip. - **Waits** shows proportion bars, and **I/O** shows summary tiles for the main server-wide InnoDB I/O rates. - **Refresh all** in Server reads every view, including ones you have not opened yet. Each view on its own reads only while it is on screen. - Top statements, Processlist and Locks fit next to the view list at 1440 px, and row actions such as **Show plan** and **Kill…** move into the `⋯` menu. - The workspace uses the macOS system font, one top bar, a **Save investigation** sheet, a shared **Export** menu and a footer that shows the connection's write policy. - Privilege notices appear in the toolbar only when an action is denied or blocked. - Learn matches the rest of the workspace, with lesson search, a family filter, **Start learning** and the 16-lesson learning path. ## Bug fixes - Fixed an issue where quitting the macOS app could leave its backend, or a running dump, restore or clone, running in the background. - Fixed an issue where Maintenance went blank when a preflight check finished while another step's report was on screen. - Fixed an issue where live captures and reports were slow on servers with many tables. - Fixed an issue where capturing a plan from a MariaDB statement digest failed for queries with aggregate functions such as `SUM`. - Fixed an issue where MariaDB 10.7 and earlier plans showed only the last table of a multi-table join. - Fixed wrong row and loop counts in MariaDB plans with `UNION`, `INTERSECT` or `EXCEPT`, with joins, and with tables that never ran (shown as "not measured"). - Fixed an issue where `EXPLAIN`-only plans showed 0 instead of "not measured" for time and rows, or were taken as proof that a sort ran in memory. - Fixed false advisor warnings about hash joins, sorts and temporary tables. Hash joins on expressions are no longer called quadratic, and a sort or temporary table is reported as spilling to disk only when the plan measured it. - Fixed documentation links in plan findings. MySQL findings open the manual for the server's version, and MariaDB findings link to the MariaDB documentation. - Fixed an issue where a plan with control characters in its text produced an invalid SVG. Flame graph tooltips also respond faster on large plans. - Fixed version-specific advice in **Full analysis**, **Parameters** and **Tables** for redo log sizing, TempTable limits and MariaDB 11.2 and later. - Fixed an issue where **Full analysis** counted unknown findings as Watch in its section summaries. - Fixed copy and export in the Query editor and Table data. Numbers keep full `BIGINT` and `DECIMAL` precision without quotes, **Copy row as JSON** writes `NULL` as `null`, and CSV export escapes text that a spreadsheet would read as a formula. - Fixed an issue where Parameters showed numbers in scientific notation and trimmed spaces at the start or end of string values. - Fixed Database diagram's Mermaid export and import so special characters, column types, key markers and nullability survive the round trip. - Fixed an issue where **Drop index** in **Server > Indexes** failed when sent to the Query editor. - Fixed several Replication issues. Channel cards tell stopped, unknown and unjudged states apart, lag is described as a measured maximum, and **Skip** in the recovery table runs the same safety checks as the inspector. - Fixed an issue where lock ages and waits ignored the server's time zone, and where the **Lock waiters** preset in **Mass kill** also picked sessions that only held locks. - Fixed an issue where `SHOW FULL PROCESSLIST` failed on MariaDB servers that report a `Progress` column. - Fixed an issue where switching servers left **Mass kill** open, or moved **Full analysis** and **Query digest** results to the new connection. - Fixed layout, contrast and keyboard problems in the 720 x 520 minimum window, in dark mode, and with `⌘F` chart search. - Fixed an issue where a MySQL Shell dump ran with a MySQL Shell older than the server, and where **Upgrade check** on MariaDB offered older or MySQL version numbers as targets. ## Security fixes - **Mass kill** shows the exact `KILL` statements and the target server before it sends anything, and records cancelled runs in the Audit log. - `SET` statements that call functions, run subqueries, assign variables or advance MariaDB sequences are treated as writes, so they go through write review and the connection's write policy. - Turning off safe updates in the Query editor checks the saved connection policy again, and refuses the run if the connection became read-only or Production. - Update downloads come only from myflames' GitHub releases over HTTPS, and only for the file the last update check found. Partial downloads are removed. - Table, column and index names in `ALTER TABLE` statements that myflames builds are validated and quoted. - The macOS app turns off the Electron options that would let another program run code inside it. ## Deprecations and removals - The browser workspace (`myflames ui`) is deprecated in favor of the desktop app, and prints a deprecation notice when it starts. ## Packaging notes - The macOS app is an unsigned Apple Silicon build. It includes the license notices for Electron, Chromium and Python next to myflames' own `LICENSE` and `NOTICE`. ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html), or this version from [GitHub](https://github.com/vgrippa/myflames/releases/tag/v3.1.0) - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/). --- # myflames 3.0.0 Page: https://myflames.io/docs.html?article=release-notes-3-0-0 Markdown: https://myflames.io/docs/release-notes-3-0-0.md # myflames 3.0.0 (2026-10-16) myflames 3.0.0 is available as a Python package (Python 3.7 or later) with a local workspace that runs in the browser. ## Release highlights - The workspace gains a Query editor with real server sessions, transactions and write policies, and every change is recorded in a local Audit log. - Live Server views cover Health, InnoDB, Top statements, Sessions, Locks, Waits, I/O, Tables, Indexes, Configuration and Instruments, with a ranked Full analysis. - Replication, Maintenance (upgrade check, dump, restore and clone), Users and roles and Database diagram arrive in the workspace. - myflames is licensed under the Apache License 2.0 from this version on. ## New features - Adds the **Query editor**. Each tab keeps its server session, so session variables, temporary tables and open transactions survive between runs. Run the current statement or a selection, stop a running query, and read each result and the server's messages in its own tab. - Adds write policies for connections (**Production**, **Development** and **Read-only**) and an **Audit log** under **Settings**. Every write is classified before it runs, needs confirmation on Production, and is recorded with passwords removed. - Adds live **Server** views for **Health**, **InnoDB**, **Waits**, **I/O**, **Locks** and **Sessions**: status changes over time, buffer pool and redo log activity, deadlocks, open transactions and lock blockers, with **Kill** for a blocking session. - Adds **Top statements**, which reads the Performance Schema statement digests with filters for full scans, full joins, missing indexes and specific tables, and runs `EXPLAIN` from a digest. - Adds **Tables** and **Indexes**, with a database picker, storage engine totals and checks for missing primary keys and free space. Findings in Health and Indexes link to the matching statements in Top statements. - Adds **Configuration** for changing variables with `SET GLOBAL`, `SET PERSIST`, `SET PERSIST_ONLY` or `SET SESSION`, and **Instruments** with Performance Schema presets. - Adds **Full analysis**, which combines the Server views into ranked findings with SQL to copy, and **Refresh all** (`⌥⌘R`), which reloads the open views. - Adds **Database diagram**, drawn from a live connection or from imported SQL, Mermaid or JSON, with JSON, SQL, Mermaid and SVG export. - Adds **Replication**, which shows replication channels and can skip one failed transaction or run a bounded skip loop over several errors. - Adds **Maintenance**, which finds installed client tools and runs upgrade checks, logical dumps, restores and `CLONE INSTANCE`. - Adds **Users and roles** for MySQL and MariaDB accounts, roles and grants, with every change applied in one reviewed batch. - Adds duplicate and multi-select delete for connections on **Home**. - Adds plan advisor rules for large differences between estimated and actual rows (with `ANALYZE TABLE` and histogram suggestions), redundant indexes that repeat another index's leading columns, and scans of a cold buffer pool. ## Improvements - **Home** is rebuilt around a table of connections with a details panel, one **Recent work** list and **Import plan** in the top bar, which also accepts a dropped file. - **Server** views are grouped into **Overview**, **Workload**, **Contention**, **Schema**, **Setup** and **Security**. Server tables have resizable columns, a **Columns** menu, saved column layouts and one auto-refresh control. - A status bar in Plans, the Query editor and Server shows the connection, engine, session and transaction state, the last run's time and row count. - The workspace follows the system's dark appearance, including the charts, **Compare** and the **Audit log**. - Actions the account has no privilege for are disabled, with a tooltip that says which privilege is missing. - **Visual Explain** fits wide plans between 75% and 100% zoom, and **Compare** stacks its two plans on narrow screens. - Dialogs and panels keep keyboard focus inside them and give it back on `Escape`, and tables and schema trees have context menus (right-click or `Shift+F10`). ## Bug fixes - Fixed an issue where `DROP DATABASE` and `DROP SCHEMA` ran without typing the database name to confirm. `ALTER TABLE` reviews show the table size, metadata locks and open transactions, and set a 5-second `lock_wait_timeout`. - Fixed an issue where Restore started before checking the target database settings. A bad target is refused before anything is restored. - Fixed an issue where parallel **Full analysis** reads could fail. - Fixed an issue where non-ASCII names and values came back as `?` or in the wrong character set, depending on the computer's locale. Every connection uses `utf8mb4`. - Fixed an issue where flame graphs rounded times to milliseconds, so operators faster than 1 ms disappeared. - Fixed several plan parsing issues for MySQL and MariaDB: subqueries and CTEs that dropped out of the plan tree, MariaDB derived tables counted twice, and index advice that named an alias instead of the table. - Fixed an issue where a replication skip loop stopped at error 3030 instead of skipping the failure behind it, or stopped when some Performance Schema instruments were off. - Fixed wrong MariaDB privilege mappings for `SUPER` and `READ_ONLY ADMIN` between MariaDB 10.11 and 11.0, and grant parsing that lost database names with wildcards. Account changes refuse to run if the account changed after you reviewed them. - Fixed an issue where **Locks** listed queued waiters ahead of the sessions that held the locks. - Fixed an issue where **Top statements** missed executions beyond the digest table's limit and listed myflames' own queries. - Fixed Health and Configuration thresholds so redo checkpoint warnings match where the server starts forced flushing, and MariaDB's `innodb_flush_log_at_trx_commit=3` counts as durable. - Fixed read-only plan capture so `SELECT SLEEP()`, `UUID()` and `UUID_SHORT()` are allowed and `SELECT ... FOR SHARE` is refused like `FOR UPDATE`. - Fixed an issue where switching connections moved Server reports, Top statements results or editor tabs to the new server, or where an older Sessions or Locks read replaced a newer one. - Fixed an issue where Query editor edits could be overwritten by an older autosave. - Fixed layout and focus problems in inspectors and on narrow screens, and stale **Compare** results after a new comparison failed. ## Security fixes - The local workspace uses a one-time launch token and a session cookie instead of a fixed token in the page, and both expire when the workspace restarts. - Database client calls ignore environment variables, option files and login paths from the system, and saved passwords are tied to the exact host, port, user and TLS settings they were saved with. - Server writes, `KILL`, replication skips and maintenance jobs need a single-use review token and check the connection's write policy again before they run. - Read-only plan capture refuses administrative functions and SQL whose backslash escaping is ambiguous. - Editor drafts, history and grant views hide passwords, hashes and authentication secrets. - The workspace's database and password vault files must be private to your user, restore refuses paths outside the dump folder, and text from the server is shown without terminal control characters. ## Deprecations and removals - The treemap plan view is deprecated and shows the bar chart instead. ## Packaging notes - myflames is licensed under the Apache License 2.0 (`LICENSE` and `NOTICE`), after a clean-room rewrite of the flame graph renderers. Releases up to 2.3.0 stay under CDDL 1.0, and the credit to Brendan Gregg's FlameGraph and Tanel Poder's SQL Plan FlameGraphs is unchanged. ## Additional resources - Download the latest myflames from [myflames.io](https://myflames.io/download.html). Version 3.0.0 was not published as a separate download. Its changes ship in 3.1.0 - New to myflames? Start with the [Quickstart](https://myflames.io/docs.html?article=quickstart) - Report a problem or ask for a feature on [GitHub Issues](https://github.com/vgrippa/myflames/issues) Inspired by [Brendan Gregg's FlameGraph](https://github.com/brendangregg/FlameGraph) and [Tanel Poder's SQL Plan FlameGraphs](https://tanelpoder.com/posts/visualizing-sql-plan-execution-time-with-flamegraphs/).