Almost every "make it faster" attempt starts with a guess and a plugin. Start with one number instead, because it splits the problem in half.
Time to first byte
curl -o /dev/null -s -w 'dns %{time_namelookup}s connect %{time_connect}s ttfb %{time_starttransfer}s total %{time_total}s\n' https://yourdomain.com/
- TTFB under 200ms - the server is fine. Everything you feel is in the browser: images, fonts, scripts.
- TTFB over 800ms - the page is being built slowly. Nothing in the browser will fix that.
- connect much larger than dns - distance or a slow TLS handshake, not the application.
If the server is slow
The page is doing too much work per request. In order of how often it is the answer:
- A query with no index — The slow query log names it. One index usually takes seconds off.
- The same query in a loop — Twenty products, twenty queries for their categories. One join replaces them.
- An external call with no timeout — A dead API holds your page for as long as its socket stays open.
- No opcode cache — Without opcache PHP recompiles every file on every request.
If the browser is slow
- Images. Usually most of the bytes. Serve the size the page uses, not the size the camera made.
- Fonts. Each family and weight is a file, and a font that blocks paint holds the whole page.
- Third-party scripts. The slowest part of most pages is code from someone else's server.
A caching plugin on a slow page hides the problem from you and not from the first visitor of every cache period. Fix the page, then cache it.
Measure the same page three times, at the same time of day, before and after each change. One change, one measurement - or you will not know which one worked.