# MySQL performance monitoring for Laravel, compared

> How Sailfish compares to Releem, Percona PMM, MySQL's sys schema, Laravel Pulse and the APMs
> for watching the MySQL server behind a Laravel application.

Source: https://boring-observability.dev/sailfish/vs
Section: Comparisons — Sailfish

---

## Tools with a dedicated comparison

### Sailfish vs Releem: MySQL history or MySQL tuning

A hosted MySQL tuning service. An agent on the database server sends metrics and query statistics to Releem's cloud, which recommends configuration changes and indexes and can apply them.

- What it is: Hosted MySQL tuning advisor
- Releem pricing: From $39 a month per server, billed annually
- Full comparison: https://boring-observability.dev/sailfish/vs/releem.md

**Bottom line:** Releem tunes MySQL: it is a hosted service, priced monthly per server, that recommends configuration changes and indexes and can apply them. Sailfish keeps performance_schema's history in your own database through restarts, from inside a Laravel app, and alerts when it changes. A server nobody has tuned needs Releem first. Knowing which index stopped being read, or when a table started being scanned, needs the history Sailfish keeps.

### Sailfish vs Percona PMM: index history or fleet monitoring

A free, open-source monitoring platform. You host PMM Server, and a client beside each database sends it metrics and query analytics, charted in Grafana.

- What it is: Self-hosted database monitoring platform
- Percona PMM pricing: Free and open source
- Full comparison: https://boring-observability.dev/sailfish/vs/percona-pmm.md

**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.

## Other tools

### MySQL's sys schema

- What it is: Views over performance_schema, built in
- Pricing: Free, part of MySQL
- Link: https://dev.mysql.com/doc/refman/8.4/en/sys-schema.html

schema_unused_indexes lists the indexes with no recorded I/O, and schema_redundant_indexes gives the DROP INDEX for one that another index makes redundant. Two more views show the tables and the statements read without an index. MySQL Workbench's Performance Reports are built on these views. The sys schema is already installed and answers today's question well. The counters behind the unused and full-scan views start over at every restart, and the manual says the unused list only means something once the server has run a representative workload. Sailfish reads the same counters and keeps them.

### Laravel Pulse

- What it is: Slow queries, from the application
- Pricing: Free, MIT
- Link: https://laravel.com/docs/12.x/pulse#slow-queries-card

Its Slow Queries card lists the queries your application ran that took longer than a threshold, 1,000 ms by default and settable per query, grouped by their SQL and the file and line that ran them. It listens to Laravel's own query events rather than reading performance_schema, so it sees only your application's queries and nothing about indexes or lock waits. Pulse keeps seven days, and its code treats that as a ceiling.

### Laravel Nightwatch

- What it is: Every query in a sampled request or job, hosted
- Pricing: A free tier, then $20 to $300 a month by events
- Link: https://nightwatch.laravel.com/docs/queries

Nightwatch records each query in a sampled request or job with its duration and the file and line it came from, and lists them grouped by connection and SQL with average and p95 times. Like Pulse it instruments the application and does not read performance_schema. History runs from 14 to 90 days depending on the plan.

## Common questions

### How do I monitor MySQL performance in a Laravel app?

Decide which side you need to see. Laravel Pulse and Nightwatch watch from the application: Pulse lists queries over a threshold, and Nightwatch records every query in a sampled request. MySQL's performance_schema watches from the server, counting index reads and lock waits for every client, and Percona PMM, Releem, Datadog and Sailfish all read it. Sailfish keeps its history inside your Laravel app and your own database.

### How do I find unused indexes in MySQL?

MySQL's sys.schema_unused_indexes view lists indexes with no recorded I/O, but only since the server last started, so just after a restart it lists almost every index. To be sure, you need that history kept across restarts. Releem has a schema check for them and Datadog flags them in its recommendations. Sailfish keeps each index's last read through restarts and reports one that saw no read in 30 days. Percona PMM has no unused-index check for MySQL.

### Is there a free way to monitor MySQL?

Yes. Percona PMM is free and open source, though you host its server. MySQL's sys schema is built in, and MySQL Workbench's Performance Reports are a view of it. Laravel Pulse is free and shows slow queries from the application. None of the free options keeps per-index history across restarts and alerts on it, which is the part Sailfish charges for.

### Do these tools conflict with each other?

No. Releem, PMM, Datadog and Sailfish read performance_schema, which any number of clients can read at once, and Pulse and Nightwatch listen inside the application. The cost of running several is each one's collection queries. If anything truncates a performance_schema summary table, Sailfish takes a new baseline rather than recording a drop.
