Which WordPress SEO Plugin Is Actually the Best? We Tested All 7 and Measured Everything

We put Yoast, Rank Math, AIOSEO, SEOPress, The SEO Framework, Slim SEO and Hydrogen SEO on identical hardware and measured every millisecond, query and byte. The winner is not who you think.

In this article 8 sections
  1. Method
  2. What each plugin costs
  3. What each plugin produces
  4. Admin and editor weight
  5. Deactivation: what stays behind
  6. Category winners
  7. What the re-run changed
  8. How to reproduce this

The short answer: The SEO Framework, then Slim SEO. Between them they won every cost category we measured, they are the two least-installed plugins in the test, and neither is the one most people reach for. Yoast wins if you want the most complete output regardless of cost. All in One SEO lost every cost category it entered. Our own plugin placed third on speed and failed a check bare WordPress passes.

Here is how we know. We installed Yoast SEO, Rank Math, All in One SEO, SEOPress, The SEO Framework, Slim SEO and our own Hydrogen SEO on the same WordPress site, activated exactly one at a time, and measured what each one costs and what each one produces. Every number below comes from that run. The lightest plugin adds about 8 ms of PHP time per request; the heaviest adds about 54 ms and 22 extra database queries. None of the seven added a single front-end JavaScript or CSS file. One of them — ours — turned out to have a real bug, which we are reporting here rather than hiding. It is now fixed.

This is the comparison we wanted to read and could not find: no invented benchmark figures, no vendor marketing restated as fact, and a disclosed conflict of interest. We build Hydrogen SEO. It does not win most of these categories.

Updated 8 September 2026. Every number here is from a second, complete re-run of the whole field on a freshly rebuilt rig — not a patch of the original figures. We re-ran it because we shipped fixes to our own plugin off the back of the first run and it would have been dishonest to compare our new numbers against everyone else's old ones. Three competitors had also released in the meantime (Rank Math 1.0.277.2 → 1.0.278, Slim SEO 4.10.0 → 4.10.1) and Hydrogen SEO went 0.0.14 → 0.0.18. What changed, and what we got wrong the first time, is in what the re-run changed at the end.

Method

A dedicated WordPress install, untouched by any other plugin:

WordPress7.1
PHP8.2.27
DatabaseMySQL 8.0.35
ThemeTwenty Twenty-Five (unchanged)
Content40 posts, 8 pages, 6 categories, 15 tags, 5 images, featured image on every post
Permalinks/%postname%/
Measured pageOne single post with a featured image, two taxonomies and internal links

The protocol for every plugin, including the no-plugin baseline:

  1. Restore the database from one identical snapshot, so no plugin ever sees another plugin's leftovers.
  2. Activate exactly one SEO plugin. No other plugin was active at any point.
  3. Load the admin so activation and install routines finish, then flush rewrite rules.
  4. Send 6 warm-up requests, then 13 measured requests per URL, and take the median.
  5. Record server cost from inside WordPress with a must-use plugin that loads before the plugin under test, so everything it does falls inside the measured window.
  6. Deactivate, and measure what was left behind.

Every plugin ran at its own defaults. Only Rank Math needed a configuration step: it gates its front-end output behind registration, so we set the same two options its own Skip button sets. Without that it emits nothing at all and would have looked deceptively light.

The whole run was executed twice. Every deterministic metric — memory, query count, head bytes, schema bytes, autoloaded option size, asset counts — was byte-identical across both passes. Timing varied about ±10% run to run, which is normal on a single machine, so timings below are the mean of both passes and should be read as relative costs, not as absolute numbers for your server. Rankings are driven by the deterministic metrics wherever possible.

The baseline — WordPress with no SEO plugin — was: 53.9 ms PHP, 38 MB peak memory, 35 queries, 51,123 bytes of <head>, 49.8 KB of autoloaded options, 4 front-end asset files.

What each plugin costs

Everything is expressed as the change from that baseline. Lower is better in every column.

PluginPHP timePeak memoryQueriesHooks<head> bytesAutoloaded optionsPackageCustom tables
🏆 The SEO Framework 5.1.4+8.0 ms+2.0 MB+0+8+3,821+4.2 KB2.9 MB0
🏆 Slim SEO 4.10.1+10.0 ms+2.0 MB+2+51+1,649−0.2 KB1.4 MB0
Hydrogen SEO 0.0.18+12.9 ms+4.5 MB+1+22+4,259+0.4 KB4.6 MB0
SEOPress 10.2+24.5 ms+6.5 MB+1+114+2,380+3.6 KB11.7 MB1
Rank Math 1.0.278+36.1 ms+8.5 MB+16+155+4,965+11.6 KB15.1 MB6
Yoast SEO 28.4+39.0 ms+10.5 MB+3+187+5,656+13.6 KB21.0 MB6
All in One SEO 5.0.1.1+53.5 ms+14.5 MB+22+100+6,668+14.6 KB24.4 MB9

Reading notes:

  • Autoloaded options are the sleeper metric. They are read from the database on every single request, admin and front-end, whether or not the page uses them. AIOSEO and Yoast each add roughly 14 KB; Slim SEO and Hydrogen SEO add effectively nothing.
  • Custom database tables are more common than we first reported. Our original run credited only Yoast with creating them; a full table diff shows All in One SEO creating nine, Yoast and Rank Math six each (four of Rank Math's are ActionScheduler), and SEOPress one. The SEO Framework, Slim SEO and Hydrogen SEO create none. Tables are not automatically bad — Yoast's indexables pre-compute SEO data to avoid work at render time, which is why it holds +3 queries despite its size — but they are real schema you now own, and they survive deactivation.
  • Rank Math got heavier between versions. At 1.0.277.2 its query count moved between 41 and 50 across runs; at 1.0.278 it is a stable +16. That is the largest regression we saw from any plugin update during this work.
  • Hooks counts registered WordPress filter/action hooks. The SEO Framework's +8 is remarkable restraint; Yoast's +187 reflects how much it integrates with.

Front-end footprint: everybody passes

This is the metric plugin marketing shouts about most, and it turned out to be a non-issue:

PluginFront-end asset files addedKB addedInline JS added
All seven000 bytes

Every plugin in this test printed only markup — meta tags and JSON-LD — with no extra script or stylesheet requests and no inline JavaScript on a standard post. The four asset files and 28.6 KB the page loads are WordPress core and the theme, identical in all eight configurations. If you have been choosing an SEO plugin on front-end weight, choose on something else.

What each plugin produces

Cost only matters against output. Here is what actually landed in the page.

PluginMeta descriptionCanonicalOpen Graph tagsX/Twitter tagsJSON-LD typesJSON-LD bytes
🏆 Rank Math✅✅11862,665
Slim SEO✅✅112103,828
SEOPress✅✅10600
The SEO Framework✅✅10591,881
Hydrogen SEO✅✅105102,071
Yoast SEO❌✅105123,976
All in One SEO✅✅6384,544

Three findings deserve spelling out, because each is the kind of thing a feature checklist hides:

Yoast prints no meta description. On a post where nobody typed a description and no template was configured, Yoast emits no <meta name="description"> at all. This is a defensible design choice — Google frequently rewrites descriptions anyway, and Yoast would rather leave the field to the search engine than auto-generate filler — but if you assumed installing Yoast means every page gets a description, it does not. Every other plugin here generates one from the content.

SEOPress free outputs no structured data. Zero JSON-LD on a standard post at default settings. Its meta and Open Graph coverage is solid, but schema is not part of what the free version does out of the box. If structured data matters to you — and for AI answer engines it does — that is a significant gap.

Hydrogen SEO — ours — printed no canonical tag. Version 0.0.14 emitted a full metadata block and a complete schema graph, then omitted <link rel="canonical"> entirely, and suppressed the one WordPress core would have printed. Bare WordPress with no SEO plugin at all handled canonicals better than our plugin did. That was a bug, not a philosophy, and it was the single worst result any plugin posted in any category here.

The cause was worth more than the symptom: canonical output was opt-in per context handler, and only the homepage had been wired up, so posts, pages, categories, tags and author archives all lost the tag silently. A design like that re-breaks itself, so the fix moved canonical output into one place that covers every context, honours a per-page override, and points paged archives at themselves instead of page one. It shipped in 0.0.15 and the re-test above confirms it: every context now emits exactly one correct canonical.

We published this defect before it was fixed, and we are leaving the account of it here rather than quietly deleting it now that the row reads ✅. A benchmark that only ever flatters its author is worth nothing.

Sitemaps

We followed each sitemap index into every child sitemap and counted what was really there.

PluginEntry pointChildrenURLsImage entrieslastmod coverage
🏆 Yoast SEO/sitemap_index.xml5754074 / 75
Hydrogen SEO/sitemap.xml4724072 / 72
Slim SEO/sitemap.xml4734050 / 73
All in One SEO/sitemap.xml573073 / 73
Rank Math/sitemap_index.xml359059 / 59
SEOPress/sitemaps.xml3584050 / 58
The SEO Framework/sitemap.xmlflat, no index51051 / 51
(WordPress core)/wp-sitemap.xml574051 / 74

Every plugin declared its sitemap in robots.txt, and every sitemap was valid XML. Beyond that they differ more than you would expect:

  • Image entries. Yoast, Hydrogen SEO, Slim SEO and SEOPress include the posts' featured images. Rank Math has include_images on by default but include_featured_image off, so on a site whose images are featured images rather than inline ones, its sitemap ships no images until you change that setting. AIOSEO free and The SEO Framework included none. This is a default-configuration finding, not a claim about what each plugin can do.
  • URL coverage. Rank Math (59) omits tag and author archives by default; The SEO Framework (51) ships a deliberately minimal flat sitemap with posts and pages only. Neither is wrong — both are opinions about what belongs in a sitemap — but if you expect your taxonomy archives submitted, check.
  • lastmod. Hydrogen SEO, AIOSEO, Rank Math and The SEO Framework stamp every URL. Slim SEO and SEOPress leave roughly a third unstamped. WordPress core leaves 23 of 74 unstamped.

Admin and editor weight

The cost you actually feel day to day is in wp-admin, not on the front end.

PluginDashboard HTMLDashboard timeEditor assets loadedEditor asset KBAdmin menus added
🏆 The SEO Framework130.3 KB151.7 ms25 files77.6 KB+2
Slim SEO130.8 KB156.3 ms14 files187.7 KB+0
Hydrogen SEO131.2 KB158.1 ms2 files700.4 KB+2
SEOPress185.5 KB183.3 ms17 files217.0 KB+2
Yoast SEO150.2 KB202.4 ms48 files4,160 KB+2
Rank Math154.0 KB205.7 ms24 files1,792 KB+2
All in One SEO511.0 KB232.1 ms130 files3,543 KB+2

Baseline was a 129.8 KB dashboard in 153.2 ms with 95 scripts in the block editor.

The spread here is the widest in the whole benchmark. All in One SEO renders a 511 KB dashboard — roughly four times bare WordPress — and pulls 130 of its own files into the post editor. Yoast loads 4.2 MB of its own assets into the editor, the heaviest single figure we recorded. At the other end, The SEO Framework and Slim SEO are almost indistinguishable from having no SEO plugin installed.

Hydrogen SEO's editor number is worth explaining rather than spinning: 2 files, but 700 KB, because its editor UI is a React application in one bundle. That is lighter than Rank Math, Yoast and AIOSEO by a wide margin and heavier than The SEO Framework, Slim SEO and SEOPress. It is a real cost of a modern dashboard, and we would rather state it than average it away.

Nobody spammed admin notices: all seven produced the same 8 notices as bare WordPress, except Slim SEO with 9.

Deactivation: what stays behind

A deactivated plugin's autoloaded options are still read on every request. Clean baseline is 49.8 KB.

PluginAutoloaded after deactivationVerdict
🏆 The SEO Framework49.8 KB — exact baselineReleases everything
Slim SEO41.5 KBReleases everything
Hydrogen SEO50.0 KB+0.2 KB
Yoast SEO52.4 KB+2.6 KB, plus 6 tables remain
SEOPress53.4 KBNo reduction at all
Rank Math60.8 KB+11.0 KB still autoloading
All in One SEO64.3 KBNo reduction — 14.5 KB still autoloading

Deactivating AIOSEO or SEOPress does not reduce their autoloaded footprint by a single byte. Rank Math releases about half a kilobyte of the eleven it took. If you are trialling plugins, deactivation is not uninstallation, and on these three it is barely even a pause.

Category winners

CategoryWinnerNumber
Fastest (PHP time added)🏆 The SEO Framework+8.0 ms
Lowest memory added🏆 The SEO Framework / Slim SEO+2.0 MB
Fewest extra queries🏆 The SEO Framework+0
Fewest hooks registered🏆 The SEO Framework+8
Smallest <head> growth🏆 Slim SEO+1,649 bytes
Lightest autoloaded options🏆 Slim SEO−0.2 KB
Smallest shipped package🏆 Slim SEO1.4 MB
No custom database tables🏆 The SEO Framework / Slim SEO / Hydrogen SEO0 tables
Front-end asset footprint🏆 All seven — tie0 files, 0 KB
Richest schema graph🏆 Yoast SEO12 types
Most efficient schema🏆 Hydrogen SEO10 types in 2,071 bytes
Most complete social tags🏆 Rank Math11 OG + 8 X
Most complete sitemap🏆 Yoast SEO75 URLs, 40 images, 74 lastmod
Full lastmod coverage🏆 Hydrogen SEO / Rank Math / AIOSEO100% — Hydrogen over the most URLs, and the only one of the three with images
Lightest admin + editor🏆 The SEO Framework129.9 KB, 77.6 KB assets
Cleanest deactivation🏆 The SEO Frameworkexact baseline restore

The SEO Framework wins or shares seven of the sixteen categories; Slim SEO five. If your priority is a plugin that costs almost nothing and stays out of your way, those two are the measured answer, and neither is the plugin most people install. Their trade-offs are real: The SEO Framework ships no image entries and a minimal flat sitemap; Slim SEO offers almost no configuration surface, only two X/Twitter tags, and leaves a third of its sitemap URLs without a lastmod.

Yoast wins the two output-completeness categories — the richest schema graph and the most complete sitemap — and pays for it with the second-highest PHP cost, the largest hook surface, 4.2 MB of editor assets and six permanent database tables. That is a coherent product decision, not a flaw.

Hydrogen SEO — ours — places third on PHP time and memory, second on queries and autoloaded options, ties first on image entries and on creating no database tables, and wins schema efficiency outright. It is also the plugin that moved most between the two runs, because the first run found real problems in it. That is the point of measuring your own product on the same rig as everyone else's.

All in One SEO lost every cost category it entered: highest PHP time, highest memory, +22 queries, largest head growth, biggest package, nine custom tables, a 511 KB dashboard, and no autoload reduction at all on deactivation. It is polished and approachable, and on these measurements it is the most expensive plugin here.

What the re-run changed

Publishing the first run cost us two corrections and bought us two fixes. Both are worth stating plainly.

What we got wrong

  • "Yoast is the only plugin that creates custom database tables" was false. A full table diff shows All in One SEO creating nine, Rank Math six, and SEOPress one, alongside Yoast's six. We had checked the diff, but our first harness captured the table list after a plugin had already been activated once, so tables created at activation were invisible to it. Fixed by snapshotting the database before any SEO plugin was ever switched on.
  • Our first PHP timings were inflated across the board. The baseline barely moved (53.9 → 54.5 ms) but every plugin's delta came down — The SEO Framework from +13.3 to +8.0 ms, Slim SEO from +12.4 to +10.0. The ordering at the top did not change, but the gaps did, so treat any single-run millisecond figure — ours included — as approximate.

What changed in the field

  • Rank Math got measurably heavier. At 1.0.277.2 its query count wandered between 41 and 50; at 1.0.278 it is a stable +16. That is the only regression we saw from a plugin update during this work.
  • All in One SEO improved from +33 queries to +22, and from +61.3 to +53.5 ms. Still last on every cost measure.

What we fixed in our own plugin

The first run put Hydrogen SEO third on speed and, more embarrassingly, behind bare WordPress on canonical tags. Both are addressed:

0.0.14 (first run)0.0.18 (this run)
Canonical tagnone at allpresent on every context
Queries added+7+1 — and +0 once settings have been saved
PHP time added+15.4 ms+12.9 ms
Shipped package5.5 MB / 683 files4.6 MB / 322 files

The queries were the interesting one. All seven came from reading our own settings one key at a time — and on a site that had never saved a settings screen, none of those rows existed, so each read cost a query that found nothing. WordPress caches a miss only for the current request unless a persistent object cache is installed, so every page view paid seven round-trips to learn the keys were still absent. Cheap on localhost; 7–35 ms on hosting with network-attached MySQL, which means our own first benchmark understated it. Priming them in one query took it to +1 on a fresh install and +0 on a configured one, at a cost of 72 bytes of autoloaded options.

The package shrank because we were shipping src/ — the pre-build TypeScript sources — alongside the compiled output, in every install and every update.

Neither of those was a trade-off. Both were waste, and we only found them because we ran our own product through the same rig as everyone else's.

How to reproduce this

The full build log — the rig, the protocol, the six mistakes that would each have produced confidently wrong numbers, and measured pros and cons for all seven plugins — is in how we tested these plugins.

Nothing here needs our infrastructure. Install one plugin at a time on a scratch site, restore the database between runs, and measure peak memory, get_num_queries() and wall time from a must-use plugin that loads first. Count what lands in <head>, follow your sitemap index into its children, and check what is still autoloading after you deactivate. Our full methodology is in the benchmark methodology guide, and the general version of the exercise is in measuring the real cost of an SEO plugin.

If you want the fuller qualitative picture — free-tier boundaries, agent capabilities, who each plugin suits — that is in our WordPress SEO plugin comparison. If you want to see what a plugin built around measured restraint plus an SEO agent looks like, Hydrogen SEO's core is free with no account required — install it on a staging site and hold it to exactly the standard above. Numbers first; we published ours, bug included.