# Sailfish vs Percona PMM: index history or fleet monitoring

> PMM is a free, self-hosted platform for monitoring fleets of database servers. Sailfish keeps the index and table history that PMM does not chart for MySQL.

Source: https://boring-observability.dev/sailfish/vs/percona-pmm
Section: Comparisons — Sailfish
Updated: 2026-11-11

---

**Bottom line:** Percona PMM is a free, self-hosted platform for monitoring fleets of database servers, with per-query analytics and Grafana dashboards, and you run its server. Sailfish keeps per-index and per-table history from performance_schema for good, from inside a Laravel app with nothing else to host, and alerts when it changes. Watching many servers, or paying nothing, points to PMM. Knowing which index went cold, or when a table started being scanned, needs the history Sailfish keeps and PMM does not chart for MySQL.

[Percona Monitoring and Management](https://www.percona.com/software/database-tools/percona-monitoring-and-management) (PMM) is a free, open-source monitoring platform for database fleets. You run PMM Server, one container that bundles Grafana and its own databases, and a PMM Client next to each database sends it metrics and query analytics. Sailfish is a Laravel package that runs inside your application, keeps the history of MySQL's performance_schema counters in your own database, and sends an event when they change.

PMM is the free tool a MySQL user is most likely to have heard of, so it is the natural thing to try first. This page describes PMM 3.10, released on October 22, 2026.

## A platform and a package

PMM is built to watch many servers at once. Its MySQL dashboards chart the server every few seconds, and its Query Analytics breaks the workload down by query, user, schema and client host, with EXPLAIN plans. Advisors check configuration and security once a day. It covers PostgreSQL and MongoDB as well, and runs in high-availability mode on Kubernetes.

Sailfish answers a narrower set of questions about one MySQL server, over a longer time: which indexes are read and when each was last read, and which tables are scanned without an index and since when. It keeps those answers through the restarts that reset performance_schema, and it sends an event when one of them moves.

## At a glance

| Capability | Percona PMM | Sailfish |
| --- | --- | --- |
| What it is | A self-hosted monitoring platform: PMM Server, plus a client beside each database | A Laravel package inside your app |
| License and price | Free and open source (server AGPLv3, client Apache 2.0); Percona sells support | One-time purchase per application |
| What you run | PMM Server (4 cores, 8 GB of memory and 100 GB of disk for up to 30 nodes) and pmm-agent with its exporters on each database host | Nothing new: the Laravel scheduler you already run |
| Databases | MySQL, Percona Server, MariaDB, PostgreSQL and MongoDB, including RDS, Aurora and Cloud SQL | MySQL 8.0 |
| Database grants | `SELECT`, `PROCESS`, `REPLICATION CLIENT` and `RELOAD`, plus `BACKUP_ADMIN` on 8.x | `SELECT` on `performance_schema`, and two optional extras |
| Query analytics | Every query, grouped and filtered by user, client host, schema or service, with examples and EXPLAIN | Statement digests with rows examined, p95 and p99 |
| Reads and last use per index | No dashboard; one panel charts the five indexes with the most I/O wait | Each index's status, last read and 30 days of reads and writes |
| Unused MySQL indexes | No check (PostgreSQL and MongoDB have one) | "Never used" and "index went cold" events |
| Full table scans | Server-wide counters, and a full-scan flag on each query in Query Analytics | Per table, rows scanned against rows read through an index |
| History | 30 days by default; more costs disk | Five-minute detail for 7 days, hourly for 90, daily for good |
| Alerts | Grafana alerting with 48 templates; the MySQL ones cover a server going down, restarts, connections and replication | Eighteen events with same-hour baselines, including table scans and unused indexes |
| Where alerts go | Anywhere Grafana can send: email, Slack, PagerDuty, Teams, webhooks and more | Mail and Slack, plus a JSON webhook |
| Host metrics (CPU, memory, disk) | Yes | No |

## Where PMM is the better answer

**It costs nothing.** Percona's README says every feature is open source and there is no paid edition, and every advisor and alert template has shipped built in since PMM 3.5. If the budget is zero, PMM is where to start.

**A fleet, or more than MySQL.** One PMM Server watches dozens of database servers across engines, with replication and cluster dashboards and node metrics for each host. Sailfish runs inside one Laravel application and reads the MySQL server that application uses.

**Query-level investigation.** Query Analytics is the deeper tool for "which query is slow, for whom, and why", with examples, EXPLAIN plans, the tables each query touched and its lock time. Sailfish's statement digests list the expensive statement shapes with their row counts, and stop there.

**Seconds, not minutes.** PMM samples the server every few seconds, so it can show a spike that lasted thirty seconds. Sailfish snapshots every five minutes and is built for the trend over days and weeks.

## Where Sailfish is the better answer

**Which indexes are used, and when they stopped.** PMM has no MySQL index dashboard and no unused-index advisor for MySQL. By default it also stops collecting table statistics on a server with more than 1,000 tables. The per-index series it does collect sit in VictoriaMetrics, so you could build part of the view yourself in PromQL. Sailfish gives every index a status (hot, cold, never used or dropped) and a last-read date that survives a restart. A cold or never-used index goes in the daily digest, and the never-used finding says how big the index is and whether another index covers it.

**Scans per table, with an alert when they jump.** PMM counts full scans for the whole server, and flags them per query in Query Analytics. Sailfish splits each table's reads into rows read through an index and rows scanned, so the migration that dropped an index shows up as one line climbing while the other falls. Its table-scan surge compares the last hour with the same hour on the previous seven days, and allows for ordinary growth in traffic.

**Alerts you do not have to write.** PMM's alerting is Grafana's, which can express anything once you write the rule. Its MySQL templates cover a server going down, a restart, connections in use and replication threads stopping. Sailfish ships eighteen detectors with their thresholds already set, for row-lock time, errors by number, the share of transactions rolled back and the index and table findings above.

**Long history, small footprint.** PMM keeps 30 days by default, and Percona's sizing rule is about a gigabyte of disk per node for each week you keep. Sailfish rolls its snapshots up into daily figures it keeps for good, in a few tables in your own database, and it keeps a dropped index's history too.

**Nothing more to run.** PMM Server is one more service to host, size, back up and upgrade, and since PMM 3.9 upgrades happen from the command line or the container runtime, with no downgrade path. Sailfish is a Composer dependency that the scheduler already running your app keeps collecting.

## Can you run both?

We would expect so, though we have not certified the pairing. Both read performance_schema, and neither changes what MySQL records. Sailfish takes a fresh baseline whenever a counter goes backwards, whatever reset it. A sensible split is PMM for the live server and the per-query detail, and Sailfish for the index and table history and the alerts about it.

## Choosing between them

If you look after several database servers, or want per-query analytics without paying for anything, run PMM. If you have one Laravel application on MySQL and the questions are about indexes and tables over months, Sailfish answers them without another server to look after.


## Common questions

### Is Sailfish a Percona PMM alternative?

Only for a narrow part of PMM. PMM monitors fleets of database servers with dashboards, per-query analytics, advisors and Grafana alerting. Sailfish runs inside one Laravel app and keeps the long history of index and table activity that PMM does not chart for MySQL, with the alerts for it already set up.

### Can Percona PMM show unused indexes in MySQL?

Not as of PMM 3.10. Its unused-index checks cover PostgreSQL and MongoDB, and none covers MySQL. MySQL's own sys.schema_unused_indexes lists indexes with no recorded I/O since the last restart. Sailfish keeps each index's last read through restarts and reports an index that went cold, or saw no read in 30 days, in its daily digest.

### Is Percona PMM free?

Yes. PMM Server is AGPLv3 and PMM Client is Apache 2.0, and Percona says there is no paid edition: it sells support. You pay for the machine it runs on, which Percona sizes at 4 cores, 8 GB of memory and 100 GB of disk for up to 30 nodes.

### Can I run Percona PMM and Sailfish together?

We expect so, though we have not certified the pairing. Both read performance_schema, and Sailfish takes a fresh baseline whenever a counter goes backwards, whatever reset it. PMM would cover the live server and the per-query detail, and Sailfish the index and table history and the alerts about it.
