The best WordPress SEO plugin for database performance, measured
The SEO Framework is the best SEO plugin for database performance we measured: zero extra queries per request, no custom tables, and the only plugin that returned autoloaded options to the exact baseline when deactivated. Slim SEO and Hydrogen SEO (ours) are effectively tied behind it, both with no tables and near-zero autoload growth; Slim SEO takes second on a cleaner exit.
Database figures in our seven-plugin benchmark were byte-identical across two full runs, so unlike timings they are exact for our test site. We build Hydrogen SEO.
How we ranked them
Three database costs, all deterministic:
- Queries per request. Each is a round trip to MySQL. On localhost they are cheap; on hosting with network-attached MySQL, a handful of extra queries adds real time to every uncached page.
- Autoloaded options. WordPress reads every autoloaded option on every request, admin and front end, whether the page needs it or not. Our baseline was 49.8 KB.
- Custom tables and leftovers. Tables are schema you now own through backups, migrations and uninstalls. They survive deactivation, and so can autoloaded options.
Queries rank first, then autoload growth, then what is left behind.
The SEO Framework
+8 ms front-end, +0 queries, 0 custom tables, 9 JSON-LD types
+0 queries, alone in the field. +4.2 KB of autoloaded options, no tables, and deactivation restored exactly 49.8 KB, the baseline to the decimal. Nothing is left to clean up. See The SEO Framework alternatives.
Slim SEO
+10 ms front-end, +2 queries, 0 custom tables, 10 JSON-LD types
+2 queries, no tables, and autoloaded options that came out 0.2 KB below baseline. Deactivation released everything. It is one query behind Hydrogen SEO on a fresh install and cleaner on the way out, which is why it takes second in a near tie.
Hydrogen SEO
+12.9 ms front-end, +1 queries, 0 custom tables, 10 JSON-LD types
+1 query on a fresh install and +0 once settings have been saved, 0.4 KB of autoloaded options and no tables: everything lives in standard options and post meta. Deactivation left 0.2 KB autoloading. The one query exists because it primes its settings in a single read; version 0.0.14 read them one key at a time and paid 7 queries, which the benchmark caught and we fixed.
SEOPress
+24.5 ms front-end, +1 queries, 1 custom tables, 0 JSON-LD types
+1 query, but one custom table and 3.6 KB of autoloaded options that deactivation did not reduce at all. Per request it is cheap; as a long-term guest in your database it is less tidy.
Yoast SEO
+39 ms front-end, +3 queries, 6 custom tables, 12 JSON-LD types
+3 queries is very good for its size, and the reason is six custom indexables tables that pre-compute SEO data instead of assembling it at render time. On a very large site, that design is built to save work. The costs are 13.6 KB of autoloaded options, 2.6 KB of which stay after deactivation, and tables that remain until you uninstall.
Rank Math
+36.1 ms front-end, +16 queries, 6 custom tables, 6 JSON-LD types
+16 queries per request, six tables (four belong to Action Scheduler) and 11.6 KB of autoloaded options, of which 11.0 KB kept loading after deactivation. See Rank Math alternatives.
All in One SEO
+53.5 ms front-end, +22 queries, 9 custom tables, 8 JSON-LD types
The heaviest database footprint in the test: +22 queries, nine custom tables, 14.6 KB of autoloaded options, and no reduction at all when deactivated. See Rank Math vs All in One SEO.
Deactivation is not uninstallation
If you are trialling SEO plugins, what stays behind matters. A deactivated plugin's autoloaded options are still read on every request, and its tables stay in every backup. In our run, deactivating All in One SEO or SEOPress did not reduce their autoloaded footprint by a single byte, and Rank Math kept almost all of its 11.6 KB.
To check your own site, record the autoloaded total before installing and again after deactivating:
SELECT ROUND(SUM(LENGTH(option_value)) / 1024, 1) AS autoload_kb
FROM wp_options
WHERE autoload IN ('yes', 'on', 'auto', 'auto-on');
Modern WordPress uses several autoload values, so matching only 'yes' under-reports. Then diff SHOW TABLES for new tables. A persistent object cache such as Redis narrows the query gap between plugins, because repeated reads stop reaching MySQL, but it does not remove tables. The full procedure is in our benchmark method, and if slow responses are the real problem, see reducing TTFB in WordPress.
All seven, measured
| Measured | The SEO Framework 5.1.4 | Slim SEO 4.10.1 | Hydrogen SEO 0.0.18 | SEOPress 10.2 | Yoast SEO 28.4 | Rank Math 1.0.278 | All in One SEO 5.0.1.1 |
|---|---|---|---|---|---|---|---|
| Front-end PHP time added | +8 ms | +10 ms | +12.9 ms | +24.5 ms | +39 ms | +36.1 ms | +53.5 ms |
| Peak memory added | +2 MB | +2 MB | +4.5 MB | +6.5 MB | +10.5 MB | +8.5 MB | +14.5 MB |
| Database queries added | +0 | +2 | +1 | +1 | +3 | +16 | +22 |
| Hooks registered | +8 | +51 | +22 | +114 | +187 | +155 | +100 |
<head> bytes added | +3,821 | +1,649 | +4,259 | +2,380 | +5,656 | +4,965 | +6,668 |
| Meta description by default | Yes | Yes | Yes | Yes | No | Yes | Yes |
| JSON-LD types printed | 9 | 10 | 10 | 0 | 12 | 6 | 8 |
| Open Graph / X tags | 10 / 5 | 11 / 2 | 10 / 5 | 10 / 6 | 10 / 5 | 11 / 8 | 6 / 3 |
| Sitemap URLs listed | 51 | 73 | 72 | 58 | 75 | 59 | 73 |
| Sitemap image entries | 0 | 40 | 40 | 40 | 40 | 0 | 0 |
lastmod coverage | 51 / 51 | 50 / 73 | 72 / 72 | 50 / 58 | 74 / 75 | 59 / 59 | 73 / 73 |
| Custom database tables | 0 | 0 | 0 | 1 | 6 | 6 | 9 |
| Autoloaded options added | +4.2 KB | -0.2 KB | +0.4 KB | +3.6 KB | +13.6 KB | +11.6 KB | +14.6 KB |
| Plugin package size | 2.9 MB | 1.4 MB | 4.6 MB | 11.7 MB | 21 MB | 15.1 MB | 24.4 MB |
| Block editor assets | 25 files, 77.6 KB | 14 files, 187.7 KB | 2 files, 700.4 KB | 17 files, 217 KB | 48 files, 4,160 KB | 24 files, 1,792 KB | 130 files, 3,543 KB |
| After deactivation | Releases everything (exact baseline) | Releases everything | +0.2 KB left autoloading | No reduction at all | +2.6 KB left autoloading, 6 tables remain | +11.0 KB still autoloading | No reduction: 14.5 KB still autoloading |
Measured on one WordPress 7.1 install (PHP 8.2, MySQL 8.0, Twenty Twenty-Five, 40 posts), each plugin alone with default settings, against a no-plugin baseline. Bold marks the better number in each row. Full method: how we tested.
Common questions
Which SEO plugin adds the fewest database queries?
The SEO Framework, with zero extra queries in our benchmark. Hydrogen SEO and SEOPress added one, Slim SEO two, Yoast three, Rank Math 16 and All in One SEO 22.
Are custom database tables bad?
Not automatically. Yoast's tables are why it adds only three queries. But tables are schema you maintain, and in our test every plugin's tables survived deactivation.
What are autoloaded options?
Options WordPress loads from the database on every request. The SEO plugins we tested changed that total by between -0.2 KB (Slim SEO) and +14.6 KB (All in One SEO).
Does an object cache fix plugin query counts?
It reduces how many repeated queries reach MySQL, which narrows the gap between plugins. It does not remove custom tables or shrink the autoloaded options loaded on each request.