Sailfish

MySQL performance monitoring for Laravel, compared

There are two places to watch MySQL from. Laravel Pulse and Nightwatch watch from the application and see the queries it sends. MySQL's performance_schema watches from the server, counting index reads and lock waits for every client, and Releem, Percona PMM, Datadog and Sailfish all read it. What they do with those counters, and how long they keep them, is where they differ.

Where each one runs, and what it remembers

Tool Runs Index usage Kept
Sailfish Inside your Laravel app, writing to your own database Status and last read for every index, through restarts Daily figures for good, finer detail for 90 days
Releem An agent sending to Releem's cloud A schema check for duplicate and unused indexes Three months
Percona PMM PMM Server, which you host, and a client per database One panel of the five indexes with the most I/O wait 30 days by default
Datadog The Datadog Agent, sending to Datadog Per-index usage, and an unused-index recommendation 15 months of query metrics
MySQL's sys schema Inside MySQL Indexes with no recorded I/O Since the last restart
Laravel Pulse Inside your Laravel app None; queries over a threshold, 1 s by default 7 days

Retention figures are each tool's default, and PMM's and Sailfish's are settings you can change. Releem's is the same on every public plan. The pages below give the detail and say where each figure comes from.

The rest of the field

These get no page of their own. Two are free and come from MySQL and Laravel, and Nightwatch sees queries from the application's side only.

Views over performance_schema, built in · Free, part of MySQL

MySQL's sys schema

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.

Slow queries, from the application · Free, MIT

Laravel Pulse

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.

Every query in a sampled request or job, hosted · A free tier, then $20 to $300 a month by events

Laravel Nightwatch

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.

We checked every claim here against each project's own documentation or source in November 2026. If one of them has changed since, email tech@boring-observability.dev and we will correct the page.

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.

Keep the history your server forgets.

Sailfish runs next to any of the tools above. The docs are public, and checkout ends with your license key.